Python中常见的pickle用例

时间:2010-08-09 09:15:47

标签: python serialization pickle use-case

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

泡菜的常见用例是什么?

9 个答案:

答案 0 :(得分:55)

我遇到的一些用途:

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

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

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

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

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

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

答案 1 :(得分: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

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

答案 2 :(得分:7)

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

答案 3 :(得分:7)

分散和并行计算绝对需要酸洗。

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

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

而且,是的,人们使用拣货来保存计算状态,或ipython会话,或其他任何内容。

答案 4 :(得分:4)

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

答案 5 :(得分: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)。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

  • 游戏个人资料保存
  • 游戏数据可以像生命和健康一样拯救
  • 以前记录的数字输入程序

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

答案 8 :(得分:1)

当时我在网站的一个网站上进行网页剪贴时使用了腌制,所以我想存储超过8000k的URL,并希望尽快处理它们,所以我使用了腌制,因为它的输出质量非常高。

您可以轻松地到达url,甚至在作业目录关键字停止的位置也可以非常快速地获取url详细信息以恢复该过程。