(數據科學學習手札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)瞭解更多。


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章