【pickle】python保存任何類型的中間結果

用python處理數據的過程中,經常涉及計算量相對較大但是不太變動的中間結果。如果每次想拿到這個中間結果就跑一遍計算的話,會非常浪費時間(比如預處理的訓練數據)。這個時候會思考,如果有種便捷的方法來保存這些 中間結果,就不用進行反覆計算了

對於str類型或者簡單的list類型的中間結果,我們可以直接用txt文件保存;對於dict類型的中間結果,我們可以用json保存。But, 如果中間結果是特殊的類呢? 甚至是你自己構建的類。它可能有很複雜的邏輯關係,並不一定是序列形式的。對於這種中間結果怎麼保存呢?

那麼pickle就來了。pickle可以保存任何形式的中間結果。它可以直接以二進制保存。直接看例子:

import pickle

class idol:
    def __init__(self, sing, dance, rap, basketball):
        self.sing = sing
        self.dance = dance
        self.rap = rap
        self.basketball = basketball

cxk = idol(10, 10, 10, 10)
f = open('cxk.pkl', 'wb')
content = pickle.dumps(cxk)
f.write(content)
f.close()

先將中間數據cxk降級爲沒有邏輯結構的binary,再寫到pickle文件中。

讀取如下:

import pickle

class idol:
    def __init__(self, sing, dance, rap, basketball):
        self.sing = sing
        self.dance = dance
        self.rap = rap
        self.basketball = basketball

f = open('cxk.pkl', 'rb')
cxk = pickle.loads(f.read())
f.close()
print(cxk.basketball)

pickle是支持類的list保存的,可以應對大規模數據集。

保存class list:

import pickle
class idol:
    def __init__(self, sing, dance, rap, basketball):
        self.sing = sing
        self.dance = dance
        self.rap = rap
        self.basketball = basketball

cxk = idol(10, 10, 10, 10)
ls = [cxk, cxk]
f = open('cxk_list.pkl', 'wb')
content = pickle.dumps(ls)
f.write(content)
f.close()

讀取list中的類:

import pickle
class idol:
    def __init__(self, sing, dance, rap, basketball):
        self.sing = sing
        self.dance = dance
        self.rap = rap
        self.basketball = basketball
f = open('cxk_list.pkl', 'rb')
cxk = pickle.loads(f.read())
f.close()
print(cxk[0].basketball)

這是非常實用的trick~

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