在之前的python系列推文中,我們介紹了文件讀寫系列函數(shù),也介紹了python中的很多原生數(shù)據(jù)類型,這是每個(gè)學(xué)習(xí)python語(yǔ)言的人都應(yīng)該掌握的知識(shí)。但是,如果逐漸將數(shù)據(jù)處理工作轉(zhuǎn)移到python中,就會(huì)面臨一個(gè)首要問(wèn)題——如何妥善保存python中生成的數(shù)據(jù),比如一個(gè)列表和幾個(gè)字典。許多人會(huì)選擇將數(shù)據(jù)寫入文本文檔,然后在使用時(shí)讀入。這當(dāng)然是一個(gè)解決方案,但并不“優(yōu)雅”。今天我們將介紹一種用python讀寫數(shù)據(jù)對(duì)象的優(yōu)雅方式:pickle模塊

對(duì)象的序列化和反序列化

我們?cè)?jīng)提到過(guò),python中所有數(shù)據(jù)類型的實(shí)例化都可以看作一個(gè)對(duì)象,通常是一個(gè)邏輯實(shí)體,比如類列表,以列表的形式給出。莫爾斯電碼字典,以字典的形式給出,也是一個(gè)對(duì)象。當(dāng)我們想要將信息存儲(chǔ)在一個(gè)列表中以供下一步工作使用時(shí),我們可以使用文件讀寫功能來(lái)完成它,例如:

classlist =

withopen asf:

forname inclasslist:

f.write

通過(guò)使用讀寫函數(shù),我們將列表的內(nèi)容寫入名為classlist的列表。下次用的時(shí)候再讀一遍。

但是python有一種特殊的讀寫python對(duì)象的方法,就是pickle模塊,用來(lái)解決對(duì)象的序列化和反序列化。序列化是指將python對(duì)象轉(zhuǎn)換成特殊的二進(jìn)制字符串,并以二進(jìn)制形式寫入文件,而反序列化是指讀取二進(jìn)制文件,并將其轉(zhuǎn)換回對(duì)象本身。這樣做有什么好處?最明顯的是它的存儲(chǔ)、讀寫速度會(huì)很快,后面我們會(huì)舉例說(shuō)明。其次,創(chuàng)建一個(gè)特殊的對(duì)象數(shù)據(jù)文件可以防止數(shù)據(jù)被意外修改而引起問(wèn)題。

Pickle模塊在標(biāo)準(zhǔn)庫(kù)中,很容易引入pickle模塊。

import泡菜

泡菜垃圾場(chǎng)

pickle模塊的轉(zhuǎn)儲(chǔ)方法用于將對(duì)象轉(zhuǎn)換為二進(jìn)制存儲(chǔ)文件?,F(xiàn)在我們序列化并保存一個(gè)長(zhǎng)度為100的列表。

importrandom

import泡菜

a =

with open asf:

pickle.dump

可以看出,不像一般的文件讀寫,我們的讀寫模式是wb,也就是二進(jìn)制模式寫。pickle.dump方法接收兩個(gè)必要的參數(shù),第一個(gè)是要序列化的對(duì)象,第二個(gè)是二進(jìn)制文件句柄。執(zhí)行后,在當(dāng)前的工作目錄中將會(huì)有一個(gè)名為ist.pkl的額外文件。需要注意的是,pkl只是一個(gè)形式后綴,其他任何字符都可以寫。但是,為了顯示它是一個(gè)pickle序列化數(shù)據(jù)對(duì)象,我們使用pkl作為標(biāo)記。

泡菜負(fù)荷

有讀書就有讀書。將pkl文件作為對(duì)象讀取使用pickle模塊的轉(zhuǎn)儲(chǔ)方法。現(xiàn)在我們將讀取剛剛存儲(chǔ)的數(shù)據(jù)文件

with open asf:

abak = pickle.load

這樣,您可以反序列化pkl文件,并將其轉(zhuǎn)換為python列表對(duì)象。

速度更快,體積更小

在第一部分中,我們提到使用pickle讀寫對(duì)象更有效,并且我們使用時(shí)間模塊來(lái)驗(yàn)證它

在:重要時(shí)間

in:a =

In : withopen asf:

...:starttime = time.time

...* fornum ina:

...:f.write+ 'n ')

...:filetime = time.time - starttime

...:

在:文件時(shí)間

出局: 0.32804441452026367

In : withopen asf:

...:starttime = time.time

...:pickle.dump

...:pkltime = time.time - starttime

...:

在中:pkltime

輸出: 0.10946011543273926

可以看出,對(duì)于一個(gè)長(zhǎng)度為10萬(wàn)的列表對(duì)象的相同讀寫,使用文件讀寫功能的時(shí)間是使用pickle模塊的三倍以上,文件對(duì)象越大,差距就越大。

我們可以檢查這兩個(gè)文件的大小。filewrite.txt是1980kb,而pklwrite.pkl只有880kb。打包成rar文件后,大小分別為863kb和780kb。這表明序列化對(duì)象也減少了空數(shù)據(jù)存儲(chǔ)的數(shù)量。使用pickle模塊存儲(chǔ)python數(shù)據(jù)對(duì)象既節(jié)省時(shí)間又空

文字編輯:趙

技術(shù)編輯:劉貝貝

關(guān)于我們

微信微信官方賬號(hào)“Crawler Club”分享實(shí)用stata命令,歡迎轉(zhuǎn)載和獎(jiǎng)勵(lì)。爬蟲俱樂(lè)部是由李春濤教授帶領(lǐng)的研究生和本科生組成的大數(shù)據(jù)分析和數(shù)據(jù)挖掘團(tuán)隊(duì)。

提交要求:

1)必須是原創(chuàng),禁止抄襲;

2)一定要準(zhǔn)確,詳細(xì),有舉例和截圖;

注意事項(xiàng):

1)所有投稿都會(huì)經(jīng)過(guò)微信官方賬號(hào)運(yùn)營(yíng)團(tuán)隊(duì)成員審核,審核通過(guò)后才能錄用。一旦被錄用,作者將在推特上簽名,并獲得獎(jiǎng)勵(lì)。

2)請(qǐng)?jiān)卩]件中注明提交,郵件名稱為“提交”+“推文名稱”。

3)應(yīng)讀者要求,現(xiàn)提供付費(fèi)問(wèn)答服務(wù)。如果遇到關(guān)于stata分析數(shù)據(jù)的問(wèn)題,可以在微信官方賬號(hào)里問(wèn),只需要付一點(diǎn)小報(bào)酬。我們會(huì)在后面的推文中回答他們。

1.《pickle pickle 更快的數(shù)據(jù)儲(chǔ)存方式》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《pickle pickle 更快的數(shù)據(jù)儲(chǔ)存方式》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/caijing/1702741.html