Python中常见的pickle用例

sat*_*oru 127 python serialization use-case pickle

我看过pickle文档,但我不明白pickle在哪里有用.

泡菜有哪些常见的用例?

Dav*_*rby 56

我遇到的一些用途:

1)将程序的状态数据保存到磁盘,以便它可以在重新启动时继续它停止的位置(持久性)

2)通过多核或分布式系统中的TCP连接发送python数据(编组)

3)将python对象存储在数据库中

4)将任意python对象转换为字符串,以便它可以用作字典键(例如,用于缓存和memoization).

最后一个有一些问题 - 两个相同的对象可以被腌制并产生不同的字符串 - 或者甚至同一个被腌制两次的对象可以有不同的表示.这是因为泡菜可以包括参考计数信息.

为了强调@ lunaryorn的评论 - 你不应该从不受信任的来源中取消字符串,因为精心设计的泡菜可以在你的系统上执行任意代码.例如,请参阅https://blog.nelhage.com/2011/03/exploiting-pickle/

  • 人们不应该通过网络或其他不受信任的渠道转移腌制对象,除非小心地防止腌制数据进行操纵.pickle文档明确警告*never*unpickle来自不受信任或未经身份验证的数据源. (26认同)
  • @lunaryorn:好点.如果要在机器之间传输pickle数据,请使用SSL或SSH隧道等安全通道. (4认同)
  • 然后你仍然相信端点不会利用你,这可能或不可能,取决于上下文. (3认同)

Jac*_*son 10

最小的往返示例..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Run Code Online (Sandbox Code Playgroud)

编辑:但作为酸洗的现实世界的例子的问题,也许最先进的使用酸洗的(你必须相当深挖掘到源)ZODB: http://svn.zope.org/

否则,PyPI会提到几个问题:http://pypi.python.org/pypi?:action = search&term = tips&subsmit =search

我个人已经看到几个通过网络发送的腌制对象的例子,作为一种易于使用的网络传输协议.


tas*_*oor 7

我在我的一个项目中使用过它.如果应用程序在它工作期间终止(它执行了很长的任务并处理了大量数据),我需要保存整个数据结构并在应用程序再次运行后重新加载它.我之所以使用cPickle,速度是至关重要的,数据的大小非常大.


Mik*_*rns 7

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

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

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

而且,是的,人们使用pick来保存计算状态,或者你的ipython会话,或者其他什么.


小智 6

Pickle 就像数据结构和类的“另存为..”和“打开..”。假设我想保存我的数据结构,以便它在程序运行之间保持不变。

保存:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        
Run Code Online (Sandbox Code Playgroud)

加载:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)
Run Code Online (Sandbox Code Playgroud)

现在我不必重新从头开始构建 myStuff,我可以从上次中断的地方继续学习。