自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

pickle 更快的數(shù)據(jù)儲存方式

存儲 存儲軟件
很多人會選擇將數(shù)據(jù)寫入一個文本文檔,使用時再將之讀入。這固然是一種解決辦法,但不夠“優(yōu)雅”,今天我們將會介紹一種優(yōu)雅的python讀寫數(shù)據(jù)對象的方式:pickle模塊。

在之前的python系列推文中,我們介紹了文件讀寫系列函數(shù),也介紹了諸多python中的原生數(shù)據(jù)類型,這是每一個學(xué)習(xí)python語言的人都應(yīng)該掌握的知識。而如果你正逐漸將自己的數(shù)據(jù)處理工作轉(zhuǎn)移到python上來,就會面臨一個首要的問題————如何妥善保存python中產(chǎn)生的數(shù)據(jù),如一個列表,若干個字典。很多人會選擇將數(shù)據(jù)寫入一個文本文檔,使用時再將之讀入。這固然是一種解決辦法,但不夠“優(yōu)雅”,今天我們將會介紹一種優(yōu)雅的python讀寫數(shù)據(jù)對象的方式:pickle模塊

[[233403]]

對象的序列化(serialization)與反序列化(deserialization)

我們曾經(jīng)提到,python中的所有數(shù)據(jù)類型(如列表、字典)的實(shí)例化(一個列表a = [1,2,3] ,一個字典dicta = {'name':'tom'})都可看作是一個對象(object),對象通常是一種邏輯上的實(shí)體,比如一個班級名單列表,以一個list的形式給出,則它是一個對象,一個摩爾斯電碼詞典,以一個dict的形式給出,則它也是一個對象,當(dāng)我們想將一個列表中的信息存儲下來,以備下次工作時使用時,我們也許會用文件讀寫函數(shù)來完成,如:

  1. classlist = ['tom','karry','bob'
  2.  
  3. with open("classlist.txt","w+"as f: 
  4.      for name in classlist: 
  5.          f.write(name+'\n'

通過使用讀寫函數(shù),我們將該列表的內(nèi)容分行寫入一個名為classlist的列表中。當(dāng)下次使用時再分行讀入。

但python存在著專門讀寫python對象的方法,那就是pickle模塊,用于解決對象的序列化與反序列化。所謂序列化指的是將python的對象轉(zhuǎn)化為一種專門的二進(jìn)制字符串,并將其以二進(jìn)制形式寫入一個文件中,而反序列化則是讀取該二進(jìn)制文件并將其轉(zhuǎn)化回對象本身。這樣子做有什么好處呢?最顯而易見的是它的存儲與讀寫速度會非常的快,后面我們會給出示例說明。其次創(chuàng)立專門的對象數(shù)據(jù)文件,可以防止數(shù)據(jù)被不小心修改,產(chǎn)生問題。

pickle模塊在標(biāo)準(zhǔn)庫內(nèi),引入pickle模塊很簡便。

  1. import pickle 

pickle dump

將對象轉(zhuǎn)化為二進(jìn)制存儲文件使用的是pickle模塊的dump方法,現(xiàn)在我們將一個長度為100的列表序列化并保存。

  1. import random 
  2. import pickle 
  3.  
  4. a = [random.random() for x in range(100)] 
  5.  
  6. with open("alist.pkl",'wb'as f: 
  7.      pickle.dump(a,f) 

可以看到,與一般的文件讀寫不同的是,我們的讀寫方式為wb,也就是二進(jìn)制方式書寫,pickle.dump方法接收兩個必需的參數(shù),***個是要序列化的對象,第二個是二進(jìn)制文件句柄。執(zhí)行完畢后,當(dāng)前工作目錄會多出來一個名為alist.pkl的文件,需要說明的是,pkl只是一個形式上的后綴名,你可以寫成任何其它字符,但為了顯示它是一個pickle序列化的數(shù)據(jù)對象,我們使用pkl作為標(biāo)記。

pickle load

有讀入就會有讀取,將pkl文件讀取為對象使用的是pickle模塊的dump方法,現(xiàn)在我們將剛剛存儲的數(shù)據(jù)文件讀取

  1. with open("alist.pkl",'rb'as f: 
  2.      abak = pickle.load(f) 

通過這個樣子即可反序列化pkl文件,變成python的列表對象。

更快的速度與更小的體積

在***節(jié)中我們提到,使用pickle來讀寫對象,其效率更高,我們使用time模塊驗(yàn)證一下

  1. In [27]: import time 
  2.  
  3. In [28]: a = [random.random() for x in range(100000)] 
  4.  
  5. In [29]: with open("filewrite.txt",'w'as f: 
  6.      ...:     starttime = time.time() 
  7.      ...:     for num in a: 
  8.      ...:         f.write(str(num)+'\n'
  9.      ...:     filetime = time.time() - starttime 
  10.      ...: 
  11.  
  12. In [30]: filetime 
  13. Out[30]: 0.32804441452026367 
  14.  
  15. In [31]: with open("pklwrite.pkl",'wb'as f: 
  16.      ...:     starttime = time.time() 
  17.      ...:     pickle.dump(a,f) 
  18.      ...:     pkltime = time.time() - starttime 
  19.      ...: 
  20.  
  21. In [32]: pkltime 
  22. Out[32]: 0.10946011543273926 

可以看到,對于同樣讀寫一個長度為100000的列表對象,使用文件讀寫函數(shù)所花的時間是使用了pickle模塊的三倍多,當(dāng)文件對象越大,差距也會越大。

我們可以查看兩個文件的大小,filewrite.txt 的大小為1980kb,而pklwrite.pkl僅有880kb,在分別打包為rar文件后,大小分別為863kb與780kb,這說明序列化對象同樣減少了數(shù)據(jù)存儲的空間,使用pickle模塊存儲python數(shù)據(jù)對象是既省時間又省空間的更優(yōu)雅的方法。

責(zé)任編輯:武曉燕 來源: 爬蟲俱樂部
相關(guān)推薦

2012-11-14 09:29:16

MySQLGoogle數(shù)據(jù)庫

2021-06-28 10:27:58

MacOSApp公證AppStore

2016-10-20 15:54:08

Python數(shù)據(jù)序列化

2021-05-19 07:50:53

Node.js數(shù)據(jù)傳輸

2022-08-16 16:00:05

Python

2023-12-14 07:30:04

PicklePython模塊

2017-11-14 09:28:05

2011-08-01 16:24:56

云計(jì)算云安全

2011-03-03 09:11:11

開源數(shù)據(jù)庫MySQLMysql數(shù)據(jù)庫開發(fā)

2018-03-06 09:26:27

數(shù)據(jù)身份認(rèn)證區(qū)塊鏈

2022-09-21 10:50:43

pickledillPython

2011-03-17 08:58:09

數(shù)據(jù)儲存Data StoragAndroid API

2011-07-06 09:28:06

存儲數(shù)據(jù)云計(jì)算

2016-11-01 06:47:56

海底電纜數(shù)據(jù)中心

2019-06-14 05:26:05

IPv6網(wǎng)絡(luò)互聯(lián)網(wǎng)

2013-12-30 15:53:35

數(shù)據(jù)處理華為閃存

2013-01-17 09:21:13

大數(shù)據(jù)云計(jì)算數(shù)據(jù)分析

2023-03-27 00:17:21

eBPF技術(shù)網(wǎng)絡(luò)

2022-05-09 15:43:34

JavaScriptRust開發(fā)

2012-09-06 09:36:17

谷歌NatiShalom數(shù)據(jù)處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號