本文示例代码已上传至我的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的更多相关文章

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  3. (数据科学学习手札136)Python中基于joblib实现极简并行计算加速

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...

  4. (数据科学学习手札53)Python中tqdm模块的用法

    一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...

  5. (数据科学学习手札54)Python中retry的简单用法

    一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...

  6. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  7. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  8. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

随机推荐

  1. 利用IDEA搭建SpringBoot项目,整合mybatis

    一.配置文件.启动项目 生成之后这几个文件可以删掉的 配置application spring.datasource.url=jdbc:mysql://localhost:3306/test?serv ...

  2. 从 1.5 开始搭建一个微服务框架——日志追踪 traceId

    你好,我是悟空. 前言 最近在搭一个基础版的项目框架,基于 SpringCloud 微服务框架. 如果把 SpringCloud 这个框架当做 1,那么现在已经有的基础组件比如 swagger/log ...

  3. Image-Text Matching

    重要性和意义: Image-text matching has received a large amount of interest since it associates different mo ...

  4. ajax传递参数与controller接收参数映射关系

    将ajax的参数传递至后台controller时,data 中的参数名要与controller中的形参保持一致. 前端ajax代码: 1 $.ajax({ 2 url:"/doLogin&q ...

  5. C#(.net) 面试题

    1.ASP.NET的页面生存周期 .aspx/.ashx->IIS->Asp.net_isapi.dll->HttpRuntime.ProcessRequest() ->Htt ...

  6. iis 7 -mvc WebApi {"message":"an error has occurred"}

    iis 7 - WebApi's {"message":"an error has occurred"} 原因是web api的Controller有两个类名重 ...

  7. 07 MySQL_SQL数据类型

    数据类型 整数类型: int(m) 对应java中的int bigint(m) 对应java中的long m代表显示长度,需要结合 zerofill使用 create table t_int(id i ...

  8. EF Core 数据过滤

    1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...

  9. 丽泽普及2022交流赛day18 社论

    A 暴力扫一遍 B 算法 0 似乎是二分 算法 1 随便贪心 C 算法 1 枚举一个点作为最大值 / 最小值,用单调栈维护其作为答案的左右端点即可轻易计算 . 时间复杂度 \(O(n)\) . 算法 ...

  10. 虚拟机上安装Linux系统

    1,打开VMware,文件--新建虚拟机 2,选择自定义 3,选择VMware版本,下一步 4,选择稍后安装操作系统,下一步 5,选择Linux,版本我这里用的是centos7 6, 设置虚拟名称,设 ...