Python 重启后 Gzip 输出不同
Gzip output different after Python restart
我试图在 Python 3.6.8.
中压缩一个 numpy 数组
如果我 运行 这个片段两次(不同的解释器会话),我得到不同的输出:
import gzip
import numpy
import base64
data = numpy.array([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0], [13.0, 14.0, 15.0, 16.0]])
compressed = base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
print(compressed.decode('ascii'))
示例结果(每次都不一样):
H4sIAPjHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
H4sIAPrHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
^
运行 它在一个循环中(所以同一个解释器会话),它每次都给出相同的结果
for _ in range(1000):
assert compressed == base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
我怎样才能每次都得到相同的结果? (最好没有外部库。)
Gzip 在压缩时使用一些文件信息(索引节点、时间戳等)(对此 here 的讨论很好)。你本身并没有使用文件,但你仍然在不同的时间使用它。所以这可能会产生影响(看看 Python 的 gzip 包装器实际上会提供更好的洞察力,但这超出了我的范围:)
因此,如果您有 Python 3.8+,请尝试在 gzip.compress(data.data, compresslevel=9)
中使用 mtime=0
参数,因为
gzip.compress(data.data, compresslevel=9, mtime=0)
如果这不起作用(例如旧的 Python 版本),那么您可以将 gzip.GzipFile
与 mtime
参数一起使用,如下所示:
buf = io.BytesIO()
with GzipFile(fileobj=buf, mode='wb', compresslevel=compresslevel, mtime=0) as f:
f.write(data)
result = buf.getvalue()
有关详细信息,文档为here:
我试图在 Python 3.6.8.
中压缩一个 numpy 数组如果我 运行 这个片段两次(不同的解释器会话),我得到不同的输出:
import gzip
import numpy
import base64
data = numpy.array([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0], [13.0, 14.0, 15.0, 16.0]])
compressed = base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
print(compressed.decode('ascii'))
示例结果(每次都不一样):
H4sIAPjHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
H4sIAPrHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
^
运行 它在一个循环中(所以同一个解释器会话),它每次都给出相同的结果
for _ in range(1000):
assert compressed == base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
我怎样才能每次都得到相同的结果? (最好没有外部库。)
Gzip 在压缩时使用一些文件信息(索引节点、时间戳等)(对此 here 的讨论很好)。你本身并没有使用文件,但你仍然在不同的时间使用它。所以这可能会产生影响(看看 Python 的 gzip 包装器实际上会提供更好的洞察力,但这超出了我的范围:)
因此,如果您有 Python 3.8+,请尝试在 gzip.compress(data.data, compresslevel=9)
中使用 mtime=0
参数,因为
gzip.compress(data.data, compresslevel=9, mtime=0)
如果这不起作用(例如旧的 Python 版本),那么您可以将 gzip.GzipFile
与 mtime
参数一起使用,如下所示:
buf = io.BytesIO()
with GzipFile(fileobj=buf, mode='wb', compresslevel=compresslevel, mtime=0) as f:
f.write(data)
result = buf.getvalue()
有关详细信息,文档为here: