(数据科学学习手札142)dill:Python中增强版的pickle
本文示例代码已上传至我的
Github仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,相信不少读者朋友们都在Python中利用pickle进行过序列化操作,而所谓的序列化,指的是将程序运行时在内存中产生的变量对象,转换为二进制类型的易存储可传输数据的过程,相反地,从序列化结果解析还原为Python变量就叫做反序列化。
通常我们都是用标准库pickle进行这项操作,但其功能单一,且针对很多常见的Python对象如lambda函数无法进行序列化。而今天费老师我要给大家介绍的库dill就可以看作增强版的pickle。

2 使用dill实现更丰富的序列化/反序列化操作
作为第三方库,我们使用pip install dill完成安装后,就可以使用它来代替pickle了:
2.1 基础使用
dill的基础使用与pickle一样,使用dump/dumps进行序列化操作,load/loads进行反序列化操作,下面是一些基本的例子,我们对一些常见的对象进行序列化/反序列化操作:
import dill
import numpy as np
demo_int = 999
demo_float = 0.99
demo_dict = {'a': 999}
demo_array = np.random.rand(2, 2)
# 序列化并写出到pkl文件
with open('./demo.pkl', 'wb') as d:
dill.dump(
[demo_int, demo_float, demo_dict, demo_array],
d
)
从写出的demo.pkl文件中还原对象:
# 序列化并写出到pkl文件
with open('./demo.pkl', 'rb') as d:
restore_demo = dill.load(d)
restore_demo

2.2 增强功能
看完了dill的基础用法,下面我们来介绍其相对于pickle进行增强的特殊功能:
2.2.1 对lambda函数进行序列化
pickle可以对常规的函数进行序列化,但针对lambda函数则会报错,而使用dill就可以正常序列化:

2.2.2 保存解释器的会话状态
dill中另一项很实用的功能则是其支持将当前解释器的会话状态整个打包保存和还原,譬如下面的例子,利用dill.dump_session()保存当前解释器会话状态,在另一个独立的py脚本中再利用dill.load_session()就可以一步到位全部还原:

2.2.3 从序列化结果中还原源码
dill中另一个很强大的功能是其source模块可以从序列化结果中还原对象的源码,这在序列化的对象为函数时非常实用(注意目前此功能不可以在ipykernel中执行,因此下面的例子使用魔术命令直接执行外部py脚本):

除此之外,dill还有很多其他丰富的功能,感兴趣的读者朋友可以前往其官方文档(https://dill.readthedocs.io/en/latest/dill.html)了解更多。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札142)dill:Python中增强版的pickle的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
随机推荐
- day11 - 多线程
1内容 进程.线程介绍 Java中 线程的实现方式 Thread 类 Runnable 接口 Callable 接口 线程相关的方法 线程安全问题 - 同步技术 线程等待唤醒机制 进程(Process ...
- 了解有哪几个C标准&了解C编译管道
下列哪个不是C标准.参考:C语言标准 小知识:C语言标准的发展 K&R C: 1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了 ...
- InputStreamReader介绍&代码实现和转换文件编码_练习
InputStreamReader介绍&代码实现 package com.yang.Test.ReverseStream; import java.io.FileInputStream; im ...
- ASP.NET Web 应用 Docker踩坑历程——续
ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...
- js for和while两种99乘法表
<script type="text/javascript"> for(var i=1; i<=9; i++) { for(var j=1; j<=i;j+ ...
- MySQL Test Run 测试框架介绍
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 介绍 MySQL Test Run 简称MTR,是MySQL官方提供的自动化测试框架,执行脚本在发布路径的mysql-te ...
- web前端要学些什么,学习思路
有没有Web前端大神给个意见 我已学了 html css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么
- 深入Synchronized各种使用方法
深入学习Synchronized各种使用方法 在Java当中synchronized通常是用来标记一个方法或者代码块.在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个 ...
- Git 03 理论
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 四个区域 G ...
- Linux安装JDK并配置环境变量
Linux - 安装jdk并配置环境变量 1. 前往JDK官网, 地址:https://www.oracle.com/java/technologies/downloads/ 复制下载链接 2. ...