From 1cd22f097aca2667cbfde6320178e2354d07199b Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Tue, 10 Jan 2023 07:51:23 -0500 Subject: Improve performance by reducing expensive bytes conversion In two core parts of the codebase, complex type-switch based code is used to convert a value to bytes. However, in all cases (except for one, fixed in this PR), the caller is specifying a Message instance. We can make this code much simpler by directly calling the correct method on Message. In #2110 this is measured to massively speed up large SFTP transfers. --- paramiko/packet.py | 2 +- paramiko/sftp.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paramiko/packet.py b/paramiko/packet.py index a8db2582..b6498c5e 100644 --- a/paramiko/packet.py +++ b/paramiko/packet.py @@ -390,7 +390,7 @@ class Packetizer(object): Write a block of data using the current cipher, as an SSH block. """ # encrypt this sucka - data = asbytes(data) + data = data.asbytes() cmd = byte_ord(data[0]) if cmd in MSG_NAMES: cmd_name = MSG_NAMES[cmd] diff --git a/paramiko/sftp.py b/paramiko/sftp.py index 2e9dff66..144edd4a 100644 --- a/paramiko/sftp.py +++ b/paramiko/sftp.py @@ -129,7 +129,9 @@ class BaseSFTP(object): # ...internals... def _send_version(self): - self._send_packet(CMD_INIT, struct.pack(">I", _VERSION)) + m = Message() + m.add_int(_VERSION) + self._send_packet(CMD_INIT, m) t, data = self._read_packet() if t != CMD_VERSION: raise SFTPError("Incompatible sftp protocol") @@ -190,7 +192,7 @@ class BaseSFTP(object): return out def _send_packet(self, t, packet): - packet = util.asbytes(packet) + packet = packet.asbytes() out = struct.pack(">I", len(packet) + 1) + byte_chr(t) + packet if self.ultra_debug: self._log(DEBUG, util.format_binary(out, "OUT: ")) -- cgit v1.2.1