Python中pickle的常见用例
我已经看过咸菜文档,但是我不明白咸菜的用处。
什么是泡菜的常见用例?
我遇到的一些用途:
1)将程序的状态数据保存到磁盘,以便在重新启动时可以继续执行(持久性)
2)通过多核或分布式系统中的TCP连接发送python数据(编组)
3)将python对象存储在数据库中
4)将一个任意的python对象转换为一个string,以便它可以用作字典键(例如用于caching和记忆)。
最后一个问题有一些问题 – 两个相同的对象可能会被腌制并导致不同的string – 甚至两次腌制的对象可能会有不同的表示。 这是因为泡菜可以包含参考计数信息。
最小的往返例子..
>>> 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
我亲眼见过几个腌制对象的例子,通过networking发送为一个易于使用的networking传输协议。
我已经在我的一个项目中使用了它。 如果应用程序在工作期间被终止(它执行了一个冗长的任务并处理了大量的数据),我需要保存整个数据结构并在应用程序再次运行后重新加载它。 为此,我使用了cPickle,因为速度是至关重要的,数据的大小非常大。
酸洗对于分布式和并行计算是绝对必要的。
假设你想做一个multiprocessing
的并行map-reduce(或者跨pygin的集群节点),那么你需要确保你想在并行资源上映射的函数会被pickle。 如果不腌泡,则不能将其发送到其他进程,计算机等上的其他资源。另请参见此处的示例。
为了做到这一点,我使用莳萝 ,它可以序列化几乎任何东西在Python中。 莳萝也有一些很好的工具 ,可以帮助你理解什么是你的代码失败时导致你的酸洗失败。
而且,是的,人们使用picking来保存计算的状态,或者你的ipython会话,或者其他什么。
对于初学者(就像我一样),真的很难理解为什么在阅读官方文档时首先使用pickle。 也许是因为文档暗示你已经知道序列化的全部目的。 只有阅读了序列化的一般描述之后 ,才明白了这个模块的原因及其常见用例。 另外,不考虑特定编程语言的广泛的序列化解释可能会有所帮助: https : //stackoverflow.com/a/14482962/4383472 , 什么是序列化? , https://stackoverflow.com/a/3984483/4383472
添加一个真实世界的例子:用于Python的Sphinx文档工具使用pickle来caching文档之间的分析文档和交叉引用,以加速后续的文档构build。
我可以告诉你我使用它的用途,并看到它用于:
- 游戏configuration文件保存
- 游戏数据拯救生命和健康
- 以前logging的数字input到一个程序
那些是我至less使用它的那些
腌菜就像你的数据结构和类的“另存为…”和“打开..”。 比方说,我想保存我的数据结构,以便在程序运行之间保持持久性。
保存:
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)
现在我不必从头开始重新构buildmyStuff,我可以从离开的地方select(le)。