Heim >Backend-Entwicklung >Python-Tutorial >Python中 pickle有什么意义,pickle了再恢复?

Python中 pickle有什么意义,pickle了再恢复?

WBOY
WBOYOriginal
2016-06-06 16:23:532563Durchsuche

Python初级

回复内容:

谢邀。
很多入门教程里讲解序列化一般是这个流程:
对象1 -- 序列化 -> 字节串 -- 反序列化 -> 对象2
所以很多人并不知道为什么要序列化。

估计很多人都有耳闻 Python 在处理计算密集型的任务时性能不好,一般不能充分使用多核 CPU 的优势,这时候会使用多进程来优化。
有一种多进程的计算方式是这样的,进程分为 master 和 worker,master 负责调度任务,worker 则专于计算,比如 Celery 这个库。
那么问题来了,master 中产生了一个任务需要交给 worker 来计算,因为进程之间内存是隔离的,worker 不能直接访问到这个任务对象。
所以 master 需要以某种方式将这个对象表示出来传递给 worker,而且 worker 能够根据这个表示方式来构造出这个对象(的替身),这个过程就是序列化和反序列化。
而 pickle 是 Python 内部的一种序列化方式,对 Python 对象有很好的支持,而这个原因也正是 Celery 默认使用 pickle 的原因,Is Celery dependent on pickle?
从序列化的角度来看,pickle 的方案和 JSON,YAML,XML 等没有本质的区别。
不过 pickle 的安全性不足,永远不要反序列化不可信来源的 pickle 字节串,因此 pickle 方案不适合用于网络通信。 谢邀。pickle能把几乎任何格式(全部内置类型+支持pickle的类实例)的变量用字符串表示,通常被用来存储中间结果。

这是什么意思呢?举个例子,有一天你写了要跑很长时间的程序,于是你决定增加【把当前进度保存到文件】这个功能,这样今天跑不完的话,明天还能读取存档继续今天的进度。

不过问题来了:“当前进度”不一定是一个字符串,可能是一个列表,或者字典,或者集合,甚至一个类的实例……这样乱七八糟的东西如何写到文件里?

于是pickle就有用了。

<code class="language-pycon"><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">pickle</span>
<span class="gp">>>> </span><span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
<span class="gp">... </span>  <span class="s">'1'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="gp">... </span>  <span class="mf">23.45</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="gp">... </span>  <span class="k">print</span><span class="p">:</span> <span class="nb">set</span><span class="p">(),</span>
<span class="gp">... </span>  <span class="n">b</span><span class="s">'hello'</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span>
<span class="gp">... </span><span class="p">}</span>
<span class="gp">>>> </span><span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="go">b'\x80\x03}q\x00(G@7s33333cbuiltins\nstr\nq\x01cbuiltins\nprint\nq\x02cbuiltins\nset\nq\x03]q\x04\x85q\x05Rq\x06X\x01\x00\x00\x001q\x07\x88C\x05helloq\x08]q\t(K\x00K\x00K\x00eu.'</span>
<span class="gp">>>> </span><span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="go">{23.45: <class>, <built-in function print>: set(), '1': True, b'hello': [0, 0, 0]}</built-in></class></span>
</code>
玩过游戏吗?知道 Save/Load 吗? python自带的file函数只能存储和读取字符串格式的数据.
pickle可以存储和读取成其他格式比如list dict的数据, 这叫做序列化和反序列化,把你的数据结构转换成字符串 ,可以保存到文件,方便下次快速恢复,也可以通过网络传输 之前写爬虫的时候……一不小心就写崩了……当时没用数据库,就是用这货自动恢复的。 比如说要构建机器学习模型的时候,就说决策树吧,一般情况下决策树模型都是先建树,然后剪枝,然后做预测,但这样有个不好的地方就是,明明是同一棵树上跑测试数据,但是每次都要重新建一次树,而决策树的大部分时间就浪费在建树了,所以我可以在第一次完整跑的时候用pickle把整个树保存起来,以后再跑测试的时候直接load进来预测或剪枝就好了,这样做节省了大量的时间。 序列化的时候有用,需要用到序列化的场景有session等 在其他部分高级语言里面,将对象序列化是个麻烦的事情,你要将对象自行编码,分割成串,然后存入文件。反向序列化,即读取,恢复成对象时,要解码,截取串,还原成对象。有了pickle这玩意,依靠dump和load,就可以轻松实现。 说的直白一点,就是一个存储和获取的工具,pickle把Python的数据结构用另外一种简单的形式存储到文件中,然后方便转移和传播,然后在用同一样的方法还原回去。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn