Python之Pickle学习

(1)Pickle的作用:

python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

一般序列化的流程:对象1 -- 序列化 -> 字节串 -- 反序列化 -> 对象2

但是为什么要进行序列化呢?举例:Python在处理计算密集型的任务时性能不好,一般不能充分利用多核CPU的优势,这时候会使用多进程来优化。其中有一种多进程是这样的,进程分为master和worker,matser负责调度任务,worker则专于计算,比如Celery这个库,那么问题来了,master中产生了一个任务需要交给worker来计算,因为进程之间内存是隔离的,worker不能直接访问到这个任务对象。所以master需要以某种方式将这个对象表示出来传递给worker,而且worker能够根据这个表示方式来构造出这个对象(的替身),这个过程就是序列化和反序列化。

而Pickle就是Python内部的一种序列化方式,对Python对象有很好的支持,而这个原因也正是Celery默认使用Pickle的原因。从序列化的角度来看,pickle的方案和Json,Yaml,Xml等没有本质上区别。

pickle的功能就是把你上次计算得到的数据保存起来,当你需要使用这些数据时,直接通过reload把数据恢复了就行。

再举个例子:在利用决策树构建机器学习模型的时候,一般情况下决策树模型都是先建树,然后剪枝,最后做预测,但这样有个不好的地方就是:明明是同一棵树上跑测试数据,但是每次都要重新建一次树,而决策树的大部分时间就浪费在建树上了,所以我们在第一次完整跑完的时候用Pickle把整个树保存起来,以后再跑测试的时候直接用load进来预测或剪枝就好了。说白了就是将我们训练好的模型先存储起来,后面在进行决策时候直接将模型读出,而不需要重新训练模型,这样节省了大量的时间。

因此,利用Pickle的好处有:

1:被pickle的数据,在被多次reload时,不需要重新去计算得到这些数据,这样节省计算机资源,如果你不pickle,你每调用一次数据,就要计算一次。

2:通过pickle的数据,被reload时,可以更好的被内存调用,不需要经过数据格式的转换。

有人可能觉得,我直接通过open把数据写到一个txt文档也能达到以上的效果,但是这样做的结果是,你能够达到pickle的功能,把数据保存起来,但是当你再去调用这些数据时,你的txt格式的数据,没有pickle的数据读取更高效。另外还有一点,你通过open把数据存储到txt中时的效率,就不如pickle的效率高。

综上,你如果只是做一次的数据存储和调用,以及数据量很小的情况下,你可以用open等方法保存数据和调用数据,但是当你需要通过大量计算得到一个数据,同时后期还会多次使用这个数据时,pickle的节省计算机资源的效果就出来了。


(2)Python代码实例:

实例1----基本流程

实例2--- 天气文件

文件名:天气查询.py ,原始文件大小:70KB:

部分代码:---字典中的城市和对应的编码占用程序的绝大部分长度,所以完全可以将字典利用Pickle处理,所以讲这一部分从原始代码中剪切下来,重新生成一个py文件

会生成一个city_data.pkl的文件,然后在原始程序中将文件导入并读取,这样脚本显得非常精简,文件大小也由原来的70KB,变为现在的2KB。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章