Python之Pickle學習

(1)Pickle的作用:

python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。

一般序列化的流程:對象1 -- 序列化 -> 字節串 -- 反序列化 -> 對象2

但是爲什麼要進行序列化呢?舉例:Python在處理計算密集型的任務時性能不好,一般不能充分利用多核CPU的優勢,這時候會使用多進程來優化。其中有一種多進程是這樣的,進程分爲master和worker,matser負責調度任務,worker則專於計算,比如Celery這個庫,那麼問題來了,master中產生了一個任務需要交給worker來計算,因爲進程之間內存是隔離的,worker不能直接訪問到這個任務對象。所以master需要以某種方式將這個對象表示出來傳遞給worker,而且worker能夠根據這個表示方式來構造出這個對象(的替身),這個過程就是序列化和反序列化。

而Pickle就是Python內部的一種序列化方式,對Python對象有很好的支持,而這個原因也正是Celery默認使用Pickle的原因。從序列化的角度來看,pickle的方案和Json,Yaml,Xml等沒有本質上區別。

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

再舉個例子:在利用決策樹構建機器學習模型的時候,一般情況下決策樹模型都是先建樹,然後剪枝,最後做預測,但這樣有個不好的地方就是:明明是同一棵樹上跑測試數據,但是每次都要重新建一次樹,而決策樹的大部分時間就浪費在建樹上了,所以我們在第一次完整跑完的時候用Pickle把整個樹保存起來,以後再跑測試的時候直接用load進來預測或剪枝就好了。說白了就是將我們訓練好的模型先存儲起來,後面在進行決策時候直接將模型讀出,而不需要重新訓練模型,這樣節省了大量的時間。

因此,利用Pickle的好處有:

1:被pickle的數據,在被多次reload時,不需要重新去計算得到這些數據,這樣節省計算機資源,如果你不pickle,你每調用一次數據,就要計算一次。

2:通過pickle的數據,被reload時,可以更好的被內存調用,不需要經過數據格式的轉換。

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

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


(2)Python代碼實例:

實例1----基本流程

實例2--- 天氣文件

文件名:天氣查詢.py ,原始文件大小:70KB:

部分代碼:---字典中的城市和對應的編碼佔用程序的絕大部分長度,所以完全可以將字典利用Pickle處理,所以講這一部分從原始代碼中剪切下來,重新生成一個py文件

會生成一個city_data.pkl的文件,然後在原始程序中將文件導入並讀取,這樣腳本顯得非常精簡,文件大小也由原來的70KB,變爲現在的2KB。

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