问题:Python中泡菜的常见用例
我看过泡菜文档,但是我不知道泡菜在哪里有用。
泡菜有哪些常见用例?
回答 0
我遇到的一些用途:
1)将程序的状态数据保存到磁盘,以便它可以在重新启动时从中断处继续执行(持久性)
2)在多核或分布式系统中通过TCP连接发送python数据(编组)
3)将python对象存储在数据库中
4)将任意python对象转换为字符串,以便可以将其用作字典键(例如,用于缓存和备忘录)。
最后一个存在一些问题-两个相同的对象可以被腌制并导致不同的字符串-甚至相同的对象两次被腌制也可以具有不同的表示形式。这是因为泡菜可以包括参考计数信息。
为了强调@lunaryorn的评论-切勿从不可靠的来源获取字符串,因为精心制作的pickle可以在系统上执行任意代码。例如,请参阅https://blog.nelhage.com/2011/03/exploiting-pickle/
回答 1
最小往返次数示例
>>> 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
酸洗对于分布式和并行计算绝对必要。
假设您要使用并行映射简化multiprocessing
(或使用pyina跨群集节点),那么您需要确保要在并行资源上映射的函数可以腌制。如果没有腌制,则无法将其发送到其他进程,计算机等上的其他资源。另请参见此处的示例。
为此,我使用dill,它可以在python中序列化几乎所有内容。Dill还有一些很好的工具,可以帮助您了解在代码失败时导致酸洗失败的原因。
而且,是的,人们使用挑选来保存计算状态,您的ipython会话等。
回答 3
我已经在我的一个项目中使用了它。如果该应用在工作期间终止(它完成了冗长的任务并处理了许多数据),那么我需要保存整个数据结构,并在再次运行该应用后重新加载它。我之所以使用cPickle,是因为速度至关重要,并且数据量确实很大。
回答 4
对于您的数据结构和类,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,而我可以从上次停止的地方继续学习。
回答 5
对于初学者(就像我一样),很难理解为什么在阅读官方文档时首先使用泡菜。可能是因为文档暗示您已经知道序列化的全部目的。仅在阅读了序列化的一般说明之后,我才了解该模块的原因及其常见用例。不考虑特定编程语言的序列化的广泛解释也可能会有所帮助:https : //stackoverflow.com/a/14482962/4383472,什么是序列化?, https://stackoverflow.com/a/3984483/4383472
回答 6
要添加一个真实的示例:用于Python 的Sphinx文档工具使用pickle来缓存已解析的文档和文档之间的交叉引用,以加快文档的后续构建。
回答 7
我可以告诉你我使用它的用途,并且已经看到它的用途:
- 游戏资料保存
- 游戏数据可以像生命和健康一样保存
- 以前输入程序的说号的记录
那些是我至少用过的
回答 8
当时,我在网站的一个网站上进行网页爬取时使用了腌制,因此我想存储超过8000k的URL,并希望尽快处理它们,所以我使用腌制是因为它的输出质量非常高。
您可以轻松地到达url,甚至在作业目录关键字停止的位置也可以非常快速地获取url详细信息以恢复该过程。