Skip to content

Commit a8f2f63

Browse files
committed
Made sure xrange is used instead of range in python 2
range in py2 will return a list, which can mean a lot of time and memory is spent on generating it even though it's just used for iteration. Simplified implementation of MAXSIZE
1 parent 25b6802 commit a8f2f63

File tree

9 files changed

+22
-31
lines changed

9 files changed

+22
-31
lines changed

gitdb/db/pack.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
)
1919

2020
from gitdb.pack import PackEntity
21+
from gitdb.utils.compat import xrange
2122

2223
from functools import reduce
2324

@@ -106,7 +107,7 @@ def sha_iter(self):
106107
for entity in self.entities():
107108
index = entity.index()
108109
sha_by_index = index.sha
109-
for index in range(index.size()):
110+
for index in xrange(index.size()):
110111
yield sha_by_index(index)
111112
# END for each index
112113
# END for each entity

gitdb/ext/smmap

Submodule smmap updated from 5526711 to f53ddc6

gitdb/pack.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
from binascii import crc32
6565

6666
from gitdb.const import NULL_BYTE
67-
from gitdb.utils.compat import izip, buffer
67+
from gitdb.utils.compat import izip, buffer, xrange
6868

6969
import tempfile
7070
import array
@@ -208,7 +208,7 @@ def write(self, pack_sha, write):
208208
for t in self._objs:
209209
tmplist[ord(t[0][0])] += 1
210210
#END prepare fanout
211-
for i in range(255):
211+
for i in xrange(255):
212212
v = tmplist[i]
213213
sha_write(pack('>L', v))
214214
tmplist[i+1] += v
@@ -374,7 +374,7 @@ def _read_fanout(self, byte_offset):
374374
d = self._cursor.map()
375375
out = list()
376376
append = out.append
377-
for i in range(256):
377+
for i in xrange(256):
378378
append(unpack_from('>L', d, byte_offset + i*4)[0])
379379
# END for each entry
380380
return out
@@ -415,7 +415,7 @@ def offsets(self):
415415
a.byteswap()
416416
return a
417417
else:
418-
return tuple(self.offset(index) for index in range(self.size()))
418+
return tuple(self.offset(index) for index in xrange(self.size()))
419419
# END handle version
420420

421421
def sha_to_index(self, sha):
@@ -703,7 +703,7 @@ def _iter_objects(self, as_stream):
703703
"""Iterate over all objects in our index and yield their OInfo or OStream instences"""
704704
_sha = self._index.sha
705705
_object = self._object
706-
for index in range(self._index.size()):
706+
for index in xrange(self._index.size()):
707707
yield _object(_sha(index), as_stream, index)
708708
# END for each index
709709

gitdb/test/db/lib.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from gitdb.exc import BadObject
2323
from gitdb.typ import str_blob_type
2424
from gitdb.utils.encoding import force_bytes
25+
from gitdb.utils.compat import xrange
2526

2627
from async import IteratorReader
2728

@@ -43,7 +44,7 @@ def _assert_object_writing_simple(self, db):
4344
# write a bunch of objects and query their streams and info
4445
null_objs = db.size()
4546
ni = 250
46-
for i in range(ni):
47+
for i in xrange(ni):
4748
data = pack(">L", i)
4849
istream = IStream(str_blob_type, len(data), BytesIO(data))
4950
new_istream = db.store(istream)
@@ -131,7 +132,7 @@ def _assert_object_writing_async(self, db):
131132
"""Test generic object writing using asynchronous access"""
132133
ni = 5000
133134
def istream_generator(offset=0, ni=ni):
134-
for data_src in range(ni):
135+
for data_src in xrange(ni):
135136
data = bytes(data_src + offset)
136137
yield IStream(str_blob_type, len(data), BytesIO(data))
137138
# END for each item

gitdb/test/lib.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
)
1313

1414
from gitdb.util import zlib
15+
from gitdb.utils.compat import xrange
1516

1617
import sys
1718
import random
@@ -110,7 +111,7 @@ def make_bytes(size_in_bytes, randomize=False):
110111
""":return: string with given size in bytes
111112
:param randomize: try to produce a very random stream"""
112113
actual_size = size_in_bytes // 4
113-
producer = range(actual_size)
114+
producer = xrange(actual_size)
114115
if randomize:
115116
producer = list(producer)
116117
random.shuffle(producer)

gitdb/test/test_pack.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from gitdb.fun import delta_types
2727
from gitdb.exc import UnsupportedOperation
2828
from gitdb.util import to_bin_sha
29+
from gitdb.utils.compat import xrange
2930
from itertools import chain
3031

3132
try:
@@ -64,7 +65,7 @@ def _assert_index_file(self, index, version, size):
6465
assert len(index.offsets()) == size
6566

6667
# get all data of all objects
67-
for oidx in range(index.size()):
68+
for oidx in xrange(index.size()):
6869
sha = index.sha(oidx)
6970
assert oidx == index.sha_to_index(sha)
7071

gitdb/util.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,10 @@ def byte_ord(b):
122122

123123
#{ Routines
124124

125-
def make_sha(source=None):
125+
def make_sha(source=''.encode("ascii")):
126126
"""A python2.4 workaround for the sha/hashlib module fiasco
127127
128128
**Note** From the dulwich project """
129-
if source is None:
130-
source = "".encode("ascii")
131-
132129
try:
133130
return hashlib.sha1(source)
134131
except NameError:

gitdb/utils/compat.py

+5-15
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
try:
66
from itertools import izip
7+
xrange = xrange
78
except ImportError:
89
izip = zip
10+
xrange = range
911

1012
try:
1113
# Python 2
@@ -21,19 +23,7 @@ def buffer(obj, offset, size=None):
2123

2224
memoryview = memoryview
2325

24-
if PY3:
26+
try:
27+
MAXSIZE = sys.maxint
28+
except AttributeError:
2529
MAXSIZE = sys.maxsize
26-
else:
27-
# It's possible to have sizeof(long) != sizeof(Py_ssize_t).
28-
class X(object):
29-
def __len__(self):
30-
return 1 << 31
31-
try:
32-
len(X())
33-
except OverflowError:
34-
# 32-bit
35-
MAXSIZE = int((1 << 31) - 1)
36-
else:
37-
# 64-bit
38-
MAXSIZE = int((1 << 63) - 1)
39-
del X

0 commit comments

Comments
 (0)