成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

pickle 更快的數據儲存方式

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

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

[[233403]]

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

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

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

通過使用讀寫函數,我們將該列表的內容分行寫入一個名為classlist的列表中。當下次使用時再分行讀入。

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

pickle模塊在標準庫內,引入pickle模塊很簡便。

  1. import pickle 

pickle dump

將對象轉化為二進制存儲文件使用的是pickle模塊的dump方法,現在我們將一個長度為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,也就是二進制方式書寫,pickle.dump方法接收兩個必需的參數,***個是要序列化的對象,第二個是二進制文件句柄。執行完畢后,當前工作目錄會多出來一個名為alist.pkl的文件,需要說明的是,pkl只是一個形式上的后綴名,你可以寫成任何其它字符,但為了顯示它是一個pickle序列化的數據對象,我們使用pkl作為標記。

pickle load

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

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

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

更快的速度與更小的體積

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

  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的列表對象,使用文件讀寫函數所花的時間是使用了pickle模塊的三倍多,當文件對象越大,差距也會越大。

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

責任編輯:武曉燕 來源: 爬蟲俱樂部
相關推薦

2012-11-14 09:29:16

MySQLGoogle數據庫

2021-06-28 10:27:58

MacOSApp公證AppStore

2016-10-20 15:54:08

Python數據序列化

2021-05-19 07:50:53

Node.js數據傳輸

2022-08-16 16:00:05

Python

2023-12-14 07:30:04

PicklePython模塊

2017-11-14 09:28:05

2011-03-03 09:11:11

開源數據庫MySQLMysql數據庫開發

2011-08-01 16:24:56

云計算云安全

2018-03-06 09:26:27

數據身份認證區塊鏈

2022-09-21 10:50:43

pickledillPython

2019-06-14 05:26:05

IPv6網絡互聯網

2013-12-30 15:53:35

數據處理華為閃存

2016-11-01 06:47:56

海底電纜數據中心

2011-03-17 08:58:09

數據儲存Data StoragAndroid API

2012-09-06 09:36:17

谷歌NatiShalom數據處理

2022-05-09 15:43:34

JavaScriptRust開發

2013-01-17 09:21:13

大數據云計算數據分析

2023-03-27 00:17:21

eBPF技術網絡

2011-07-06 09:28:06

存儲數據云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操狠狠干 | 成人一级片在线观看 | 永久av| av综合站| 日韩av免费看 | 日日夜夜天天 | 手机看片在线播放 | 在线中文字幕日韩 | 欧美猛交 | 国产视频一区二区 | 国产网站在线播放 | 美女国内精品自产拍在线播放 | 国产精品福利网站 | 91久久电影| 亚洲在线一区二区 | 逼逼视频 | 野狼在线社区2017入口 | 国产精品成人一区二区三区 | 伊人av在线播放 | 成人免费网视频 | 日本精品在线观看 | 亚洲电影免费 | 99免费精品视频 | 影音先锋欧美资源 | 国产这里只有精品 | 91视频官网| 人妖一区| 亚洲一区中文 | 欧美在线国产精品 | 久久久久国产精品 | 91精品国产乱码久久久久久久 | 日本欧美国产在线 | 久久成人国产精品 | 久久网一区二区三区 | 精品一区二区av | 天堂成人国产精品一区 | 国产精品国产 | 在线观看亚洲一区二区 | 最新国产精品视频 | 三级特黄特色视频 | 黄色国产视频 |