Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
608876c
Add test for zlib.compress wbits
rhpvorderman Mar 24, 2021
12fb5a5
Add wbits argument to zlib.compress
rhpvorderman Mar 24, 2021
1b34510
Use clinic to generate input
rhpvorderman Mar 24, 2021
4e90311
Update documentation for zlib
rhpvorderman Mar 24, 2021
9717252
Add blurb news entry for zlib.compress wbits parameter
rhpvorderman Mar 24, 2021
d70390e
Fix doc typo
rhpvorderman Mar 24, 2021
c819e3e
Remove unnecessary whitespace, add punctionation and complete sentences.
rhpvorderman Jun 1, 2021
1f3481f
Break line to comply with PEP-7
rhpvorderman Jun 1, 2021
8019932
Update blurb to include :func: reference
rhpvorderman Jun 1, 2021
0ea98cf
Remove erroneous double backticks
rhpvorderman Jun 1, 2021
d1c86dc
Faster gzip.compress implementation
rhpvorderman Aug 24, 2021
19a0358
More efficiently decompress gzip files in memory
rhpvorderman Aug 24, 2021
5155857
Ensure correct endianness
rhpvorderman Aug 24, 2021
fa188a6
Remove redundant line
rhpvorderman Aug 24, 2021
4e76cf5
Fix typos and test errors
rhpvorderman Aug 24, 2021
0280c95
Revert changing default on compress for backwards compatibility
rhpvorderman Aug 25, 2021
8ddee29
Update documentation with gzip speed improvements
rhpvorderman Aug 25, 2021
77f79fd
Add a blurb for gzip speed improvements
rhpvorderman Aug 25, 2021
ca3e543
Use + instead of bytes.join() method
rhpvorderman Aug 25, 2021
f881f7e
Reword docstring for read_gzip_header
rhpvorderman Aug 30, 2021
97a8100
Update docstring for gzip.compress
rhpvorderman Aug 30, 2021
eeb7766
Use subtest for zlib.compress/decompress test.
rhpvorderman Aug 30, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Faster gzip.compress implementation
  • Loading branch information
rhpvorderman committed Aug 25, 2021
commit d1c86dcf1dde1fb8442c93d999d2058c0cc7a4b1
39 changes: 34 additions & 5 deletions Lib/gzip.py
Original file line number Diff line number Diff line change
Expand Up @@ -544,14 +544,43 @@ def _rewind(self):
super()._rewind()
self._new_member = True

def compress(data, compresslevel=_COMPRESS_LEVEL_BEST, *, mtime=None):

def _create_simple_gzip_header(compresslevel: int,
mtime = None) -> bytes:
"""
Write a simple gzip header with no extra fields.
:param compresslevel: Compresslevel used to determine the xfl bytes.
:param mtime: The mtime (must support conversion to a 32-bit integer).
:return: A bytes object representing the gzip header.
"""
if mtime is None:
mtime = time.time()
if compresslevel == _COMPRESS_LEVEL_BEST:
xfl = 2
elif compresslevel == _COMPRESS_LEVEL_FAST:
xfl = 4
else:
xfl = 0
# Pack ID1 and ID2 magic bytes, method (8=deflate), header flags (no extra
# fields added to header), mtime, xfl and os (255 for unknown OS).
return struct.pack("<BBBBLBB", 0x1f, 0x8b, 8, 0, int(mtime), xfl, 255)


def compress(data, compresslevel=_COMPRESS_LEVEL_BEST, *, mtime=0):
"""Compress data in one shot and return the compressed string.
Optional argument is the compression level, in range of 0-9.
mtime can be used to set the modification time. 0 is default,
use 'None' for current time.
Comment thread
ambv marked this conversation as resolved.
Outdated
"""
buf = io.BytesIO()
with GzipFile(fileobj=buf, mode='wb', compresslevel=compresslevel, mtime=mtime) as f:
f.write(data)
return buf.getvalue()
if mtime == 0:
# Use zlib as it creates the header with 0 mtime by default.
# This is faster and with less overhead.
return zlib.compress(data, level=compresslevel, wbits=31)
header = _create_simple_gzip_header(compresslevel, mtime)
trailer = struct.pack("LL", zlib.crc32(data), (len(data) & 0xffffffff))
# Wbits=-15 creates a raw deflate block.
return b"".join([header, zlib.compress(data, wbits=-15), trailer])


def decompress(data):
"""Decompress a gzip compressed string in one shot.
Expand Down