Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b16a3b8

Browse files
committed
(This fix is really by Jeremy)
Here's my suggested replacement for gzip.py for 1.5.1. I've re-implemeted methods readline and readlines, added an _unread, and tweaked read and _read. I tried a more complicated buffer scheme for unread (using a list of strings and string.join), but it was more complicated and slower. This version is a lot faster than the current version and is still pretty simple.
1 parent 7570669 commit b16a3b8

1 file changed

Lines changed: 29 additions & 22 deletions

File tree

Lib/gzip.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ def __init__(self, filename=None, mode=None,
8080
self._write_gzip_header()
8181
elif self.mode == READ:
8282
self._read_gzip_header()
83-
8483

8584
def __repr__(self):
8685
s = repr(self.fileobj)
@@ -161,19 +160,20 @@ def writelines(self,lines):
161160
def read(self,size=None):
162161
if self.extrasize <= 0 and self.fileobj is None:
163162
return ''
164-
165-
if not size:
166-
# get the whole thing
163+
164+
readsize = 1024
165+
if not size: # get the whole thing
167166
try:
168167
while 1:
169-
self._read()
168+
self._read(readsize)
169+
readsize = readsize * 2
170170
except EOFError:
171171
size = self.extrasize
172-
else:
173-
# just get some more of it
172+
else: # just get some more of it
174173
try:
175174
while size > self.extrasize:
176-
self._read()
175+
self._read(readsize)
176+
readsize = readsize * 2
177177
except EOFError:
178178
pass
179179

@@ -183,8 +183,15 @@ def read(self,size=None):
183183

184184
return chunk
185185

186-
def _read(self):
187-
buf = self.fileobj.read(1024)
186+
def _unread(self, buf):
187+
self.extrabuf = buf + self.extrabuf
188+
self.extrasize = len(buf) + self.extrasize
189+
190+
def _read(self, size=1024):
191+
try:
192+
buf = self.fileobj.read(size)
193+
except AttributeError:
194+
raise EOFError, "Reached EOF"
188195
if buf == "":
189196
uncompress = self.decompress.flush()
190197
if uncompress == "":
@@ -237,21 +244,21 @@ def isatty(self):
237244
return 0
238245

239246
def readline(self):
240-
# XXX This function isn't implemented in a very efficient way
241-
line=""
247+
bufs = []
248+
readsize = 100
242249
while 1:
243-
c = self.read(1)
244-
line = line + c
245-
if c=='\n' or c=="": break
246-
return line
250+
c = self.read(readsize)
251+
i = string.find(c, '\n')
252+
if i >= 0 or c == '':
253+
bufs.append(c[:i])
254+
self._unread(c[i+1:])
255+
return string.join(bufs, '')
256+
bufs.append(c)
257+
readsize = readsize * 2
247258

248259
def readlines(self):
249-
L=[]
250-
line = self.readline()
251-
while line!="":
252-
L.append(line)
253-
line = self.readline()
254-
return L
260+
buf = self.read()
261+
return string.split(buf, '\n')
255262

256263
def writelines(self, L):
257264
for line in L:

0 commit comments

Comments
 (0)