【问题标题】:pickling a deserialized object produces different binary (vs original)酸洗反序列化对象会产生不同的二进制文件(与原始对象相比)
【发布时间】:2018-07-15 19:25:35
【问题描述】:

我遇到了一些奇怪的行为,其中 pickle 为相同的输入生成不同的序列化输出。它在序列化反序列化的腌制对象时以某种方式触发(如果从mp.Queue 检索对象可能会发生这种情况)。它也仅在列表包含多个元素时才会发生(不知道为什么)。有人可以解释这里发生了什么吗?我读过this question,但情况似乎不一样,因为a,b,c都有不同的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

【问题讨论】:

    标签: python numpy pickle


    【解决方案1】:

    这似乎是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多