Skip to content

Commit 5d46315

Browse files
committed
Even more overhead reduction for small bytes buffers
1 parent dec0bfa commit 5d46315

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

Lib/pickle.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -216,22 +216,23 @@ def write(self, data):
216216
else:
217217
return self.file_write(data)
218218

219-
def write_large(self, header, payload):
219+
def write_large_bytes(self, opcode, size_header, payload):
220220
if len(payload) >= self._FRAME_SIZE_TARGET and self.current_frame:
221221
# Terminate the current frame to write the next frame directly into
222222
# the underlying file to skip the unnecessary memory allocations
223223
# of a large temporary buffer.
224224
self.commit_frame(force=True)
225225
write = self.file_write
226-
write(FRAME + pack("<Q", len(header) + len(payload)))
226+
frame_size = len(opcode) + len(size_header) + len(payload)
227+
write(FRAME + pack("<Q", frame_size))
227228

228229
# Be careful to not concatenate the header and the payload prior to
229230
# calling 'write' as do not want to allocate a large temporary
230231
# bytes object.
231-
write(header)
232+
write(opcode + size_header)
232233
write(payload)
233234
else:
234-
self.write(header + payload)
235+
self.write(opcode + size_header + payload)
235236

236237

237238
class _Unframer:
@@ -396,7 +397,7 @@ def __init__(self, file, protocol=None, *, fix_imports=True):
396397
raise TypeError("file must have a 'write' attribute")
397398
self.framer = _Framer(self._file_write)
398399
self.write = self.framer.write
399-
self._write_large = self.framer.write_large
400+
self._write_large_bytes = self.framer.write_large_bytes
400401
self.memo = {}
401402
self.proto = int(protocol)
402403
self.bin = protocol >= 1
@@ -714,9 +715,9 @@ def save_bytes(self, obj):
714715
if n <= 0xff:
715716
self.write(SHORT_BINBYTES + pack("<B", n) + obj)
716717
elif n > 0xffffffff and self.proto >= 4:
717-
self._write_large(BINBYTES8 + pack("<Q", n), obj)
718+
self._write_large_bytes(BINBYTES8, pack("<Q", n), obj)
718719
else:
719-
self._write_large(BINBYTES + pack("<I", n), obj)
720+
self._write_large_bytes(BINBYTES, pack("<I", n), obj)
720721
self.memoize(obj)
721722
dispatch[bytes] = save_bytes
722723

@@ -727,9 +728,9 @@ def save_str(self, obj):
727728
if n <= 0xff and self.proto >= 4:
728729
self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
729730
elif n > 0xffffffff and self.proto >= 4:
730-
self._write_large(BINUNICODE8 + pack("<Q", n), encoded)
731+
self._write_large_bytes(BINUNICODE8, pack("<Q", n), encoded)
731732
else:
732-
self._write_large(BINUNICODE + pack("<I", n), encoded)
733+
self._write_large_bytes(BINUNICODE, pack("<I", n), encoded)
733734
else:
734735
obj = obj.replace("\\", "\\u005c")
735736
obj = obj.replace("\n", "\\u000a")

0 commit comments

Comments
 (0)