酸洗反序列化的对象会生成不同的二进制文件(与原始文件相比)

时间:2018-07-15 19:25:36

标签: python numpy pickle

我遇到了一些奇怪的行为,泡菜为相同的输入生成了不同的序列化输出。序列化反序列化的腌制对象时,它会以某种方式触发(如果从mp.Queue中检索到该对象,则会发生这种情况)。它也仅在列表具有多个元素(不确定原因)时发生。有人可以解释这里发生了什么吗?我已经读过this question,但情况似乎并不一样,abc都有不同的ID。

下面复制的代码。我正在使用Anaconda的Python 3.6.3。

import pickle
import numpy as np

def f():
    return np.array([1,2,3])

a = f()
b = f()
c = pickle.loads(pickle.dumps(f()))

print(id(a), id(b), id(c)) # 4464565184 4464565504 4466959424

print('[a]==[b]', pickle.dumps([a]) == pickle.dumps([b])) # True
print('[a]==[c]', pickle.dumps([a]) == pickle.dumps([c])) # True
print('[b]==[c]', pickle.dumps([b]) == pickle.dumps([c])) # True
print('[a,b]==[a,c]', pickle.dumps([a,b]) == pickle.dumps([a,c])) # False
print('a.tolist()==c.tolist()', a.tolist()==c.tolist()) # True

1 个答案:

答案 0 :(得分:0)

这似乎是特定于numpy的问题,因为没有它,pickle可以正常工作 在python 3.6.6中:

import pickle

def f():
    return [1,2,3]

a = f()
b = f()
c = pickle.loads(pickle.dumps(f()))

print(id(a), id(b), id(c)) # 1900503702728 1900503865288 1900503976328

print('[a]==[b]', pickle.dumps([a]) == pickle.dumps([b])) # True
print('[a]==[c]', pickle.dumps([a]) == pickle.dumps([c])) # True
print('[b]==[c]', pickle.dumps([b]) == pickle.dumps([c])) # True
print('[a,b]==[a,c]', pickle.dumps([a,b]) == pickle.dumps([a,c])) # True