Python 3.9 和 3.10 之间 level=0 的 zlib 大小差异

2024-02-19

在这段代码中,使用 zlib 对一些数据进行编码,但 level=0,因此它实际上并未被压缩:

import zlib

print('zlib.ZLIB_VERSION', zlib.ZLIB_VERSION)

total = 0
print('Total 1', total)
compress_obj = zlib.compressobj(level=0, memLevel=9, wbits=-zlib.MAX_WBITS)
total += len(compress_obj.compress(b'-' * 1000000))
print('Total 2', total)
total += len(compress_obj.flush())
print('Total 3', total)

Python 3.9.12 输出

zlib.ZLIB_VERSION 1.2.12
Total 1 0
Total 2 983068
Total 3 1000080

但Python 3.10.6(和Python 3.11.0)输出

zlib.ZLIB_VERSION 1.2.13
Total 1 0
Total 2 1000080
Total 3 1000085

所以最终尺寸不同,沿途尺寸也不同。

为什么?我怎样才能使它们相同? (我正在编写一个库,我希望 Python 版本之间具有相同的行为)


zlib 1.2.12 和 1.2.13 在这方面的行为相同。 Python 库必须有所不同deflate()调用不同数量的数据,并可能在后续版本中引入刷新。你可以查看Python源代码来找出答案。

如果您提供较少量的数据,您应该能够强制输出相同的输出.compress()每次,例如小于 64K-1,并使用.flush()每个之后。输出会更大,但跨版本应该相同。

快速一看就出现了这次提交 https://github.com/python/cpython/commit/f9bedb630e8a0b7d94e1c7e609b20dfaa2b22231,这可能是罪魁祸首。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3.9 和 3.10 之间 level=0 的 zlib 大小差异 的相关文章

随机推荐