文章來源於:Python大數據分析
簡介
大家好,相信不少讀者朋友們都在Python中利用pickle進行過序列化操作,而所謂的序列化,指的是將程式執行時在記憶體中產生的變數物件,轉換為二進位制型別的易儲存可傳輸資料的過程,相反地,從序列化結果解析還原為Python變數就叫做反序列化。
通常我們都是用標準庫pickle進行這項操作,但其功能單一,且針對很多常見的Python物件如lambda函式無法進行序列化。而今天要給大家介紹的庫dill就可以看作增強版的pickle。
使用dill實現更豐富的序列化/反序列化操作
作為第三方庫,我們使用pip install dill完成安裝後,就可以使用它來代替pickle了:
基礎使用
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
增強功能
看完了dill的基礎用法,下面我們來介紹其相對於pickle進行增強的特殊功能:
對lambda函式進行序列化
pickle可以對常規的函式進行序列化,但針對lambda函式則會報錯,而使用dill就可以正常序列化
儲存直譯器的會話狀態
dill中另一項很實用的功能則是其支援將當前直譯器的會話狀態整個打包儲存和還原,譬如下面的例子,利用dill.dump_session()儲存當前直譯器會話狀態,在另一個獨立的py指令碼中再利用dill.load_session()就可以一步到位全部還原:
從序列化結果中還原原始碼
dill中另一個很強大的功能是其source模組可以從序列化結果中還原物件的原始碼,這在序列化的物件為函式時非常實用(注意目前此功能不可以在ipykernel中執行,因此下面的例子使用魔術命令直接執行外部py指令碼):
除此之外,dill還有很多其他豐富的功能,感興趣的讀者朋友可以前往其官方文件(https://dill.readthedocs.io/en/latest/dill.html)瞭解更多。
以上就是本文的全部內容,本文示例程式碼已上傳至Github倉庫
https://github.com/CNFeffery/DataScienceStudyNotes
文章連接:https://mp.weixin.qq.com/s/XF8sdTvUc48JxTvpoqE7Lg
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~