summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--paramiko/file.py9
-rw-r--r--sites/www/changelog.rst10
2 files changed, 15 insertions, 4 deletions
diff --git a/paramiko/file.py b/paramiko/file.py
index 9e9f6eb8..9dd9e9e7 100644
--- a/paramiko/file.py
+++ b/paramiko/file.py
@@ -192,7 +192,7 @@ class BufferedFile(ClosingContextManager):
raise IOError("File is not open for reading")
if (size is None) or (size < 0):
# go for broke
- result = self._rbuffer
+ result = bytearray(self._rbuffer)
self._rbuffer = bytes()
self._pos += len(result)
while True:
@@ -202,10 +202,10 @@ class BufferedFile(ClosingContextManager):
new_data = None
if (new_data is None) or (len(new_data) == 0):
break
- result += new_data
+ result.extend(new_data)
self._realpos += len(new_data)
self._pos += len(new_data)
- return result
+ return bytes(result)
if size <= len(self._rbuffer):
result = self._rbuffer[:size]
self._rbuffer = self._rbuffer[size:]
@@ -515,9 +515,10 @@ class BufferedFile(ClosingContextManager):
# <http://www.python.org/doc/current/lib/built-in-funcs.html>
self.newlines = None
- def _write_all(self, data):
+ def _write_all(self, raw_data):
# the underlying stream may be something that does partial writes (like
# a socket).
+ data = memoryview(raw_data)
while len(data) > 0:
count = self._write(data)
data = data[count:]
diff --git a/sites/www/changelog.rst b/sites/www/changelog.rst
index 48119f00..9387aabf 100644
--- a/sites/www/changelog.rst
+++ b/sites/www/changelog.rst
@@ -2,6 +2,16 @@
Changelog
=========
+- :bug:`892 major` Significantly speed up low-level read/write actions on
+ `~paramiko.sftp_file.SFTPFile` objects by using `bytearray`/`memoryview`.
+ This is unlikely to change anything for users of the higher level methods
+ like ``SFTPClient.get`` or ``SFTPClient.getfo``, but users of
+ `SFTPClient.open <paramiko.sftp_client.SFTPClient.open>` will likely see
+ orders of magnitude improvements for files larger than a few megabytes in
+ size.
+
+ Thanks to ``@jkji`` for the original report and to Sevastian Tchernov for the
+ patch.
- :support:`1985` Add ``six`` explicitly to install-requires; it snuck into
active use at some point but has only been indicated by transitive dependency
on ``bcrypt`` until they somewhat-recently dropped it. This will be