我已经查看了 泡菜文档,但是我不明白 pickle 在哪里有用。
泡菜的一些常见用例是什么?
最小的往返例子. 。
>>> 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。如果它不腌制,您就不能将它发送到另一个进程、计算机等上的其他资源。也可以参考 给你获得一个很好的例子。
multiprocessing
为此,我使用 莳萝,它可以序列化 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 详细信息,以便继续进程。