我查看了pickle文档,但我不明白pickle在哪里有用。
泡菜的常见用例是什么?
答案 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/4383472,What 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详细信息以恢复该过程。