用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~