Python中 pickle有什麼意義,pickle了再恢復?

Python初級


謝邀。

很多入門教程里講解序列化一般是這個流程:

對象1 -- 序列化 -&> 位元組串 -- 反序列化 -&> 對象2

所以很多人並不知道為什麼要序列化。

估計很多人都有耳聞 Python 在處理計算密集型的任務時性能不好,一般不能充分使用多核 CPU 的優勢,這時候會使用多進程來優化。

有一種多進程的計算方式是這樣的,進程分為 master 和 worker,master 負責調度任務,worker 則專於計算,比如 Celery 這個庫。

那麼問題來了,master 中產生了一個任務需要交給 worker 來計算,因為進程之間內存是隔離的,worker 不能直接訪問到這個任務對象。

所以 master 需要以某種方式將這個對象表示出來傳遞給 worker,而且 worker 能夠根據這個表示方式來構造出這個對象(的替身),這個過程就是序列化和反序列化。

而 pickle 是 Python 內部的一種序列化方式,對 Python 對象有很好的支持,而這個原因也正是 Celery 默認使用 pickle 的原因,Is Celery dependent on pickle? 。

從序列化的角度來看,pickle 的方案和 JSON,YAML,XML 等沒有本質的區別。

不過 pickle 的安全性不足,永遠不要反序列化不可信來源的 pickle 位元組串,因此 pickle 方案不適合用於網路通信。


玩過遊戲嗎?知道 Save/Load 嗎?


之前寫爬蟲的時候……一不小心就寫崩了……當時沒用資料庫,就是用這貨自動恢復的。


python自帶的file函數只能存儲和讀取字元串格式的數據.

pickle可以存儲和讀取成其他格式比如list dict的數據,


序列化的時候有用,需要用到序列化的場景有session等


比如說要構建機器學習模型的時候,就說決策樹吧,一般情況下決策樹模型都是先建樹,然後剪枝,然後做預測,但這樣有個不好的地方就是,明明是同一棵樹上跑測試數據,但是每次都要重新建一次樹,而決策樹的大部分時間就浪費在建樹了,所以我可以在第一次完整跑的時候用pickle把整個樹保存起來,以後再跑測試的時候直接load進來預測或剪枝就好了,這樣做節省了大量的時間。


pickle的功能就是把你上次計算得到的數據保存起來,當你需要使用這些數據時,直接通過reload把數據恢復了就行,這樣的好處有:

  1. 被pickle的數據,在被多次reload時,不需要重新去計算得到這些數據,這樣節省計算機資源,如果你不pickle,你每調用一次數據,就要計算一次。
  2. 通過pickle的數據,被reload時,可以更好的被內存調用,不需要經過數據格式的轉換。

有人可能覺得,我直接通過open把數據寫到一個txt文檔也能達到以上的效果,但是這樣做的結果是,你能夠達到pickle的功能,把數據保存起來,但是當你再去調用這些數據時,你的txt格式的數據,沒有pickle的數據讀取更高效。

另外還有一點,你通過open把數據存儲到txt中時的效率,就不如pickle的效率高。

綜上,你如果只是做一次的數據存儲和調用,以及數據量很小的情況下,你可以用open等方法保存數據和調用數據,但是當你需要通過大量計算得到一個數據,同時後期還會多次使用這個數據時,pickle的節省計算機資源的效果就出來了。


說的直白一點,就是一個存儲和獲取的工具,pickle把Python的數據結構用另外一種簡單的形式存儲到文件中,然後方便轉移和傳播,然後在用同一樣的方法還原回去。


sequence


在其他部分高級語言裡面,將對象序列化是個麻煩的事情,你要將對象自行編碼,分割成串,然後存入文件。反向序列化,即讀取,恢復成對象時,要解碼,截取串,還原成對象。有了pickle這玩意,依靠dump和load,就可以輕鬆實現。


這叫做序列化和反序列化,把你的數據結構轉換成字元串 ,可以保存到文件,方便下次快速恢復,也可以通過網路傳輸


推薦閱讀:

在Python中如何修改字元串中的某一位字元?
Python3.5.1中如何將input讀取的字元串改為數字?
Python 中為何沒有數字到字元串的自動轉換?
要用python研究股票需要安裝哪些庫?
為什麼 Python 的類不構成作用域(scope)?

TAG:Python | Python入門 |