Python序列化 - 为什么要pickle?

kir*_*off 83 python serialization pickle

我知道Python pickling是一种以对象编程方式"存储"Python对象的方式 - 与用txt文件或DB编写的输出不同.

关于以下几点,您有更多细节或参考资料:

  • 腌制对象"存储"在哪里?
  • 为什么酸洗保留对象表示比存储在DB中更多?
  • 我可以从一个Python shell会话中检索pickled对象吗?
  • 序列化有用时,您是否有重要的示例?
  • 用pickle进行序列化是否意味着数据"压缩"?

换句话说,我正在寻找一个关于酸洗的文档 - Python.doc解释了如何实现pickle但似乎没有深入了解有关序列化的使用和必要性的细节.

aus*_*ard 95

Pickling是一种将python对象(list,dict等)转换为字符流的方法.这个想法是这个字符流包含在另一个python脚本中重建对象所需的所有信息.

至于存储腌制信息的位置,通常会做:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)
Run Code Online (Sandbox Code Playgroud)

这会将我们的vardict 的pickled版本存储在'filename'文件中.然后,在另一个脚本中,您可以从此文件加载到变量中,并重新创建字典:

with open('filename','rb') as f:
    var = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

酸洗的另一个用途是,如果您需要通过网络传输此字典(可能使用套接字或其他东西.)您首先需要将其转换为字符流,然后您可以通过套接字连接发送它.

此外,这里没有"压缩"......它只是一种从一种表示(在RAM中)转换为另一种表示(在"文本"中)的方式.

About.com 在这里有一个很好的酸洗介绍.

  • 此外,您需要将`open(filename,'wb')作为f:...`或者您无法写入文件. (3认同)
  • 通常会有一个`与open('filename')作为f:...` (2认同)

Mik*_*rns 35

酸洗对于分布式和并行计算是绝对必要的.

假设您想要使用multiprocessing(或使用pyina跨群集节点)执行并行map-reduce ,那么您需要确保要在并行资源上映射的函数将进行pickle.如果它没有发泡,你就无法将它发送到另一个进程,计算机等的其他资源.另请参阅此处以获得一个很好的示例.

为此,我使用dill,它可以在python中序列化几乎任何东西.Dill还有一些很好的工具可以帮助您了解在代码失败时导致酸洗失败的原因.

而且,是的,人们使用pick来保存计算状态,或者你的ipython会话,或者其他什么.您还可以扩展泡菜的皮克勒和Unpickler会做压缩用bz2或者gzip,如果你愿意的话.