Python中常见的pickle用例

问题描述 投票:124回答:9

我查看了pickle文档,但我不明白pickle在哪里有用。

泡菜有哪些常见的用例?

python serialization pickle use-case
9个回答
55
投票

我遇到的一些用途:

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

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

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

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

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

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


10
投票

最小的往返示例..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

编辑:但至于酸洗的现实问题的问题,也许最先进的酸洗使用(你必须深入挖掘源头)是ZODB:http://svn.zope.org/

否则,PyPI提到了几个:http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

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


7
投票

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


7
投票

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

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

为此,我使用dill,它可以在python中序列化几乎任何东西。 Dill还有some good tools帮助您了解在代码失败时导致酸洗失败的原因。

并且,是的,人们使用拣选来保存计算的状态,或者你的ipython会话,或者其他什么。


4
投票

对于初学者(就像我的情况一样),很难理解为什么在阅读official documentation时首先使用泡菜。这可能是因为文档暗示您已经知道序列化的整个目的。只有在阅读了序列化的general description之后,才明白这个模块及其常见用例的原因。对序列化的广泛解释无视特定的编程语言可能会有所帮助:https://stackoverflow.com/a/14482962/4383472What is serialization?https://stackoverflow.com/a/3984483/4383472


3
投票

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

保存:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

加载:

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

现在我不必再从头开始构建myStuff,我可以从我离开的地方选择(le)。


2
投票

添加一个真实示例:Python的Sphinx文档工具使用pickle来缓存已分析的文档和文档之间的交叉引用,以加快文档的后续构建。


1
投票

我可以告诉你我使用它的用途,并看到它用于:

  • 游戏档案保存
  • 游戏数据可以保存生命和健康
  • 先前记录的说数字输入到程序中

这些是我至少使用它的那些


1
投票

我在网站废弃网站时使用酸洗,当时我想存储超过8000k的网址,并希望尽快处理它们,所以我使用酸洗,因为它的输出质量非常高。

您可以轻松地访问网址,甚至停止工作目录关键字,也可以非常快速地获取网址详细信息以恢复进程。

© www.soinside.com 2019 - 2024. All rights reserved.