[Python-checkins] r74658 - in python/branches/py3k: Lib/http/client.py Misc/NEWS

chris.withers python-checkins at python.org
Fri Sep 4 19:04:16 CEST 2009


Author: chris.withers
Date: Fri Sep  4 19:04:16 2009
New Revision: 74658

Log:
Fixes issue #6838: use a list to accumulate the value instead of repeatedly concatenating strings.


Modified:
   python/branches/py3k/Lib/http/client.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/http/client.py
==============================================================================
--- python/branches/py3k/Lib/http/client.py	(original)
+++ python/branches/py3k/Lib/http/client.py	Fri Sep  4 19:04:16 2009
@@ -518,10 +518,7 @@
     def _read_chunked(self, amt):
         assert self.chunked != _UNKNOWN
         chunk_left = self.chunk_left
-        value = b""
-
-        # XXX This accumulates chunks by repeated string concatenation,
-        # which is not efficient as the number or size of chunks gets big.
+        value = []
         while True:
             if chunk_left is None:
                 line = self.fp.readline()
@@ -534,22 +531,22 @@
                     # close the connection as protocol synchronisation is
                     # probably lost
                     self.close()
-                    raise IncompleteRead(value)
+                    raise IncompleteRead(b''.join(value))
                 if chunk_left == 0:
                     break
             if amt is None:
-                value += self._safe_read(chunk_left)
+                value.append(self._safe_read(chunk_left))
             elif amt < chunk_left:
-                value += self._safe_read(amt)
+                value.append(self._safe_read(amt))
                 self.chunk_left = chunk_left - amt
-                return value
+                return b''.join(value)
             elif amt == chunk_left:
-                value += self._safe_read(amt)
+                value.append(self._safe_read(amt))
                 self._safe_read(2)  # toss the CRLF at the end of the chunk
                 self.chunk_left = None
-                return value
+                return b''.join(value)
             else:
-                value += self._safe_read(chunk_left)
+                value.append(self._safe_read(chunk_left))
                 amt -= chunk_left
 
             # we read the whole chunk, get another
@@ -570,7 +567,7 @@
         # we read everything; close the "file"
         self.close()
 
-        return value
+        return b''.join(value)
 
     def _safe_read(self, amt):
         """Read the number of bytes requested, compensating for partial reads.

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Sep  4 19:04:16 2009
@@ -68,6 +68,11 @@
 Library
 -------
 
+- Issue #6838: Use a list to accumulate the value instead of
+  repeatedly concatenating strings in http.client's
+  HTTPResponse._read_chunked providing a significant speed increase
+  when downloading large files servend with a Transfer-Encoding of 'chunked'.
+
 - Trying to import a submodule from a module that is not a package, ImportError
   should be raised, not AttributeError.
 


More information about the Python-checkins mailing list