Python 中 pickle 的常见用例

我已经查看了 泡菜文档,但是我不明白 pickle 在哪里有用。

泡菜的一些常见用例是什么?

25221 次浏览

最小的往返例子. 。

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

编辑: 但是对于现实世界中的 pickle 例子的问题,也许 对 pickle 最高级的使用(你必须深入挖掘源代码)是 ZODB: Http://svn.zope.org/

除此之外,PyPI 还提到了以下几点: Http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

我个人看到过几个通过网络发送 pickle 对象的例子,它们被认为是一种易于使用的网络传输协议。

我曾经在我的一个项目中使用过它。如果应用程序在运行期间被终止(它执行了一个冗长的任务并处理了大量数据) ,我需要保存整个数据结构并在应用程序再次运行后重新加载它。我使用了 cPickle,因为速度是至关重要的,而且数据的规模非常大。

我遇到的一些用法:

1)将程序的状态数据保存到磁盘上,以便重新启动时能够在停止的地方继续运行(持久性)

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

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

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

最后一个存在一些问题-两个相同的对象可以 pickle 并导致不同的字符串-或者甚至同一个对象 pickle 两次可以有不同的表示。这是因为 pickle 可以包含引用计数信息。

为了强调@lunaryorn 的评论——您永远不应该从不可信的来源中解除 pickle 字符串,因为精心制作的 pickle 可能会在您的系统上执行任意代码。例如,请参阅 https://blog.nelhage.com/2011/03/exploiting-pickle/

添加一个实际示例: Python 的 狮身人面像文档工具使用 pickle 缓存已解析的文档和文档之间的交叉引用,以加快文档的后续构建。

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

假设您希望使用 multiprocessing执行并行 map-reduce (或使用 皮娜跨集群节点执行) ,那么您需要确保您希望跨并行资源映射的函数将 pickle。如果它不腌制,您就不能将它发送到另一个进程、计算机等上的其他资源。也可以参考 给你获得一个很好的例子。

为此,我使用 莳萝,它可以序列化 python 中的几乎所有内容。Dill 还有 一些好工具,可以帮助您了解当代码失败时,是什么导致您的 pickle 失败。

而且,是的,人们使用拣选来保存计算的状态,或者您的 巨蟒会话,或者其他任何东西。

对于初学者(正如我的情况一样) ,很难理解为什么在阅读 正式文件时首先要使用 pickle。这可能是因为文档暗示您已经知道序列化的整个目的。只有在阅读了序列化的 一般描述之后,我才理解了这个模块及其常见用例的原因。对无视特定编程语言的序列化的广义解释也可能有所帮助: Https://stackoverflow.com/a/14482962/4383472 Https://stackoverflow.com/a/3984483/4383472

我可以告诉你我使用它的用途,以及它的使用情况:

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

至少那些是我用它做的

腌黄瓜就像“另存为”。."以及「开放。."用于数据结构和类。假设我想保存我的数据结构,这样它在程序运行之间是持久的。

储蓄:

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)

现在我不用再从头开始构建我的东西了,我可以从我离开的地方继续。

我使用酸洗在网页刮擦一个网站在那个时候,我想存储超过8000k 网址,并希望处理他们尽可能快,所以我使用酸洗,因为它的输出质量是非常高的。

您可以很容易地到达 url,甚至在您停止工作目录关键字的地方也可以非常快速地获取 url 详细信息,以便继续进程。