dill:Python中的增强版pickle

相信不少读者朋友们都在Python中利用pickle进行过序列化操作。所谓序列化,是将程序运行时在内存中产生的变量对象转换为二进制类型的易存储可传输数据的过程;反序列化则是从序列化结果解析还原为Python变量的过程。

通常我们使用标准库pickle进行这项操作,但其功能单一,且无法序列化一些常见的Python对象,如lambda函数。而今天我要介绍的库dill可以看作是pickle的增强版。

图片[1]-dill:Python中的增强版pickle-山海云端论坛

使用dill实现更丰富的序列化/反序列化操作

作为第三方库,我们可以使用pip install dill完成安装后,就可以使用它来代替pickle了。

基础使用

dill的基础使用与pickle一样,使用dump/dumps进行序列化操作,load/loads进行反序列化操作。下面是一些基本的例子,我们对一些常见的对象进行序列化/反序列化操作:

<code>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 )</code>

从写出的demo.pkl文件中还原对象:

<code># 序列化并写出到pkl文件 with open('./demo.pkl', 'rb') as d: restore_demo = dill.load(d) restore_demo</code>
图片[2]-dill:Python中的增强版pickle-山海云端论坛

增强功能

dill相对于pickle有一些增强的特殊功能:

对lambda函数进行序列化

pickle可以对常规的函数进行序列化,但针对lambda函数则会报错,而使用dill就可以正常序列化:

<code>import dill # 序列化lambda函数 func = lambda x: x ** 2 serialized = dill.dumps(func) # 反序列化 restored_func = dill.loads(serialized) print(restored_func(3)) # Output: 9</code>
保存解释器的会话状态

dill支持将当前解释器的会话状态整个打包保存和还原。我们可以在一个独立的Python脚本中利用dill.dump_session()保存当前解释器的状态,在另一个脚本中使用dill.load_session()还原:

<code>import dill # 保存会话状态 dill.dump_session('./session.pkl') # 在另一个脚本中加载并恢复 # dill.load_session('./session.pkl')</code>
从序列化结果中还原源码

dill的source模块可以从序列化结果中还原对象的源码,对于序列化的函数非常实用:

<code>import dill def add(x, y): return x + y # 序列化函数 serialized = dill.dumps(add) # 还原源码 restored_source = dill.source.getsource(add) print(restored_source)</code>

除了以上功能,dill还有许多其他丰富的功能。感兴趣的读者朋友可以前往其官方文档了解更多。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容