From: Chris Withers Date: Fri, 4 Sep 2009 16:51:16 +0000 (+0000) Subject: Fixes issue #6838: use a list to accumulate the value instead of repeatedly concatena... X-Git-Tag: v2.6.3rc1~91 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=49148cf5287e34a399ecfc1958d62d2d83339f64;p=python Fixes issue #6838: use a list to accumulate the value instead of repeatedly concatenating strings. --- diff --git a/Lib/httplib.py b/Lib/httplib.py index 1f584ef077..3566c0eb05 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -544,10 +544,7 @@ class HTTPResponse: def _read_chunked(self, amt): assert self.chunked != _UNKNOWN chunk_left = self.chunk_left - value = '' - - # 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() @@ -560,22 +557,22 @@ class HTTPResponse: # close the connection as protocol synchronisation is # probably lost self.close() - raise IncompleteRead(value) + raise IncompleteRead(''.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 ''.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 ''.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 @@ -596,7 +593,7 @@ class HTTPResponse: # we read everything; close the "file" self.close() - return value + return ''.join(value) def _safe_read(self, amt): """Read the number of bytes requested, compensating for partial reads. diff --git a/Misc/NEWS b/Misc/NEWS index c2eea0f580..aed5bf845b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -72,6 +72,11 @@ Core and Builtins Library ------- +- Issue #6838: Use a list to accumulate the value instead of + repeatedly concatenating strings in httplib's + HTTPResponse._read_chunked providing a significant speed increase + when downloading large files servend with a Transfer-Encoding of 'chunked'. + - Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN payloads are now ordered by integer value rather than lexicographically.