当前位置: 首页 > 科技观察

Dill:Python中pickle的增强版

时间:2023-03-18 11:43:49 科技观察

大家好,我是费老师。相信很多读者都使用过Python中的pickle进行序列化操作,而所谓序列化就是指程序运行时将内存中产生的变量对象转换成便于存储和传输的二进制类型的过程。相反,反序列化是将序列化后的结果解析并还原为Python变量时称为反序列化。通常我们使用标准库pickle来执行这个操作,但是它的功能比较单一,很多常见的Python对象比如lambda函数是无法序列化的。费老师今天要给大家介绍的图书馆莳萝可以算是pickle的加强版。使用dill实现更丰富的序列化/反序列化操作作为第三方库,我们使用pipinstalldill安装完成后就可以使用它来代替pickle:基本使用dill的基本用法与pickle,使用dump/dumps进行序列化操作,load/loads进行反序列化操作,下面是一些基本的例子,我们对一些常见的对象进行序列化/反序列化:importdillimportnumpyasnpdemo_int=999demo_float=0.99demo_dict={'a':999}demo_array=np.random.rand(2,2)#用open('./demo.pkl','wb')asd:dill.dump([demo_int,demo_float,demo_dict,demo_array],d)从写出的demo.pkl文件中恢复对象:#使用open('./demo.pkl','rb')asd:restore_demo=dill.load(d)序列化并写出到pkl文件restore_demo增强功能看完了dill的基本用法,我们来介绍一下它相对于pickle的特殊增强功能:serializelambdafunctionpickle可以序列化常规函数但是lambda函数会报错,使用dill:savingthesessionstateoftheinterpreter可以正常序列化。dill中还有一个非常好用的功能就是支持将当前解释器的session状态整体保存和恢复,比如下面这个例子,使用dill.dump_session()保存当前解释器session状态,然后使用dill.load_session()在另一个独立的py脚本中一步还原:从序列化结果还原源码dill还有一个很强大的功能就是它的source模块可以从序列化结果还原对象的源码,非常实用当序列化对象为函数时(注意ipykernel目前无法执行该函数,所以下面的例子使用magiccommands直接执行外部py脚本):除此之外,dill还有很多其他丰富的函数,有兴趣的读者可以转到其官方文档(https://dill.readthedocs.io/en/latest/dill.html)了解更多