关于Python序列化:Python序列化 – 为什么选择pickle?

Python serialization - Why pickle?

我知道,python pickle是一种以尊重对象编程的方式"存储"python对象的方法,与用txt文件或db编写的输出不同。

您是否对以下几点有更多详细信息或参考资料:

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

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


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

至于存储泡菜信息的位置,通常可以这样做:

1
2
3
with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

这将把我们的vardict的腌制版本存储在"文件名"文件中。然后,在另一个脚本中,您可以将此文件加载到变量中,然后重新创建字典:

1
2
with open('filename','rb') as f:
    var = pickle.load(f)

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

此外,这里没有"压缩"可言……这只是一种从一种表示(在RAM中)转换为另一种表示(在"文本"中)的方法。

about.com在这里介绍了腌制。


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

假设您想使用multiprocessing进行并行映射减少(或使用pyina跨集群节点),那么您需要确保要跨并行资源映射的功能将受到影响。如果它不pickle,您就不能将它发送到另一个进程、计算机等上的其他资源。另请参阅这里的一个好例子。

为此,我使用dill,它可以在Python中序列化几乎所有内容。Dill还有一些很好的工具可以帮助您理解当代码失败时,什么导致酸洗失败。

是的,人们使用选择来保存计算的状态,或者你的ipython会话,或者其他什么。如果您愿意的话,您还可以扩展pickle的pickler和unpickler来压缩bz2gzip


我发现它对于大型和复杂的自定义类特别有用。在我正在考虑的一个特定的例子中,(从数据库)收集信息来创建类已经是一半的战斗了。然后,存储在类中的信息可能会在运行时被用户更改。

您可以在数据库中拥有另一组表,并编写另一个函数来遍历存储的所有内容并将其写入新的数据库表。然后,您需要编写另一个函数,以便能够加载通过重新读取所有信息而保存的内容。

或者,您可以按原样pickle整个类,然后将其存储到数据库中的单个字段中。然后当你把它装回去的时候,它会像以前一样,一次装回去。当保存和检索复杂的类时,这可以节省大量的时间和代码。


它是一种序列化。用玉米饼比泡菜快得多。

1
2
3
4
5
6
7
8
import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)