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----基本流程
import pickle
my_list=[123,3.14,'hello',['hello world']]
pickle_file=open('my_list.pkl','wb') #后缀名随意,但是习惯用pkl表示,'wb'表示写入
pickle.dump(my_list,pickle_file)
pickle_file.close() #关闭之后,在当前目录下生成一个my_list.pkl的二进制文件
pickle_file=open('my_list.pkl','rb') #打开文件,'rb'表示读入
my_list2=pickle.load(pickle_file)
print(my_list2) #输出原始数据#输出结果
[123, 3.14, 'hello', ['hello world']]
实例2--- 天气文件
文件名:天气查询.py ,原始文件大小:70KB:
部分代码:---字典中的城市和对应的编码占用程序的绝大部分长度,所以完全可以将字典利用Pickle处理,所以讲这一部分从原始代码中剪切下来,重新生成一个py文件
import pickle
pickle_file=open('city_data.pkl','wb')
pickle.dump(city,pickle_file)
pickle_file.close()
会生成一个city_data.pkl的文件,然后在原始程序中将文件导入并读取,这样脚本显得非常精简,文件大小也由原来的70KB,变为现在的2KB。
Python之Pickle学习相关推荐
- 如何用 OpenCV、Python 和深度学习实现面部识别?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|新机器视觉 Face ID 的兴起带动了一波面部识别技术热 ...
- python白帽子学习笔记(整合)
python白帽子学习笔记(整合) 学习笔记目录 python白帽子学习笔记(整合) 前言 一.基础篇 1.正则表达式 2.列表 3.元组带上了枷锁的列表 4.奇葩的内置方法 5.格式化字符 6.序列 ...
- dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
请直接访问原文章 dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码 https://hotdog29.com/?p=595 在 2019年7月7日 上张贴 由 hotdog发表回 ...
- python之pickle库
python之pickle库 pickle库 序列化.反序列化介绍 pickle库简介 pickle模块的四个方法 dumps() dumps()方法介绍 dumps()示例 loads() load ...
- 尚观python培训_尚观Python基础入门学习,资源教程下载
课程名称 尚观Python基础入门学习,资源教程下载 课程介绍 Python开发是目前很多朋友选择学习的一门技术,在大家学习的同时,楼主在这里给大家分享了一个运维python视频教程,需要的朋友可以下 ...
- python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...
Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...
- python模块cv2人脸识别_手把手教你使用OpenCV,Python和深度学习进行人脸识别
使用OpenCV,Python和深度学习进行人脸识别 在本教程中,你将学习如何使用OpenCV,Python和深度学习进行面部识别.首先,我们将简要讨论基于深度学习的面部识别,包括"深度度量 ...
- Python Web 深度学习实用指南:第四部分
原文:Hands-On Python Deep Learning for the Web 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑 ...
- python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)
[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...
最新文章
- 比特币:区块链的最基础实现
- Linux在后台运行python程序、脚本程序、可执行程序等,关闭终端仍可保持程序运行
- 细数二十世纪最伟大的十大算法
- 报错后返回输入参数的界面
- fc协议有哪些数据传输服务器,FC协议详解
- leetcode面试题 10.03. 搜索旋转数组(二分法)
- 并行、并发和代码性能优化
- Redis开发运维实践上线部署规划之持久化设置
- ISO27001:2013和ISO27001:2005的差异对比
- 硬盘总是在计算机中消失了,我计算机的D盘,E盘和F盘都消失了,只有C盘了. 这是怎么回事? -d驱动器c驱动器...
- 传统io和NIO详细比较
- 【微积分的本质|笔记】直观理解链式法则和乘积法则
- EPICS-从零开始的电机控制
- Android反编译工具与实践
- 1064:奥运奖牌计数(C C++)
- 连接mysql数据库报错Cannot create PoolableConnectionFactory
- vue3 watchEffect用法以及清除副作用
- 20200110(已解决)powerdesigner 的一些操作
- 正在连接 127.0.0.1:20880 无法打开到主机的连接。 在端口 23: 连接失败
- c语言程序设计授课进度安排表,12级C语言程序设计教学进度表