Python常用的序列化工具對比,看哪個性能最好
json、pickle、shelve是Python提供給我們的序列化工具,小編利用休息時間學習python教程為大家整理的對比Python里面常用的序列化工具(json\pickle\marshal)看哪個性能更強大一些呢?請看下面這篇文章的介紹。

閑扯
磁盤上的數(shù)據(jù),我們一般稱為?“文件”?,一般不同的文件都有各自的后綴名,比如 .txt .docx .xlsx .jpg .mp3 .avi 。這些不同類型的文件一般分為兩大類:
文本文件: 用記事本打開看到的是英文、發(fā)文、中文等字符;
二進制文件: 用記事本打開看到的可能就是一堆亂碼;
平日里,大家接觸到的更多的是二進制文件,比如word文檔,圖片,視頻,音頻等。為了保存和讀取這些不同文件,各自都規(guī)定了各自的文件格式,這些格式是各自存儲的規(guī)范。同時為了讓保存的文件更小便于傳輸(比如,視頻通過網(wǎng)絡(luò)傳輸),各自還通過一些算法對文件數(shù)據(jù)進行壓縮,尤其是圖片、視頻和音頻都各自有很多壓縮算法,比如圖片的jpg,音頻的mp3,視頻的mkv這些即代表了相應的文件格式,還代表了其背后的壓縮算法。這些多媒體數(shù)據(jù)的壓縮算法的原則是,在保證媒體質(zhì)量的前提下盡量使得數(shù)據(jù)存儲量小。
除了文件本身的一些壓縮算法,我們還經(jīng)常使用一些通用的壓縮軟件對文件進行打包和壓縮,比如zip,WinRAR等。
Python序列化
我們使用python時,經(jīng)常用到的數(shù)據(jù)就是int,float,string,list, dict,tuple這些內(nèi)置的數(shù)據(jù)類型和結(jié)構(gòu)。寫程序時,我們很可能希望把這些基本數(shù)據(jù)存儲到硬盤,即保存存儲結(jié)果。這個過程,我們稱之為“序列化”
Python里面常用的序列化工具有:
json
pickle
marshal
cPickle是pickle的C語言實現(xiàn),速度更快,但Python3里面的pickle就是C語言實現(xiàn)的,因此不再包含cPickle模塊。
json在web中使用更為廣泛,是各種web API的首選數(shù)據(jù)格式。
以上三種工具,哪一個更快呢?
#!/usr/bin/env?pythonimport?timeimport?jsonimport?pickleimport?marshaldef?test(data,?method): ????if?method?==?'json': ????????dumps?=?json.dumps ????????loads?=?json.loads ????elif?method?==?'pickle': ????????dumps?=?pickle.dumps ????????loads?=?pickle.loads ????elif?method?==?'marshal': ????????dumps?=?marshal.dumps ????????loads?=?marshal.loads ????b?=?time.time() ????s?=?'' ????loop?=?10000????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????for?i?in?range(loop): ????????s?=?dumps(data) ????print('{}?dumps?time?cost:?{}'.format(method,?time.time()?-?b))? ????b?=?time.time() ????for?i?in?range(loop): ????????loads(s) ????print('{}?loads?time?cost:?{}'.format(method,?time.time()?-?b))? def?main(): ????#?generate?test?data ????data?=?{} ????count?=?80 ????for?i?in?range(10000): ????????k?=?'%05d'?%?(i?%?count) ????????if?k?in?data: ????????????data[k].append(i?/?count) ????????else: ????????????data[k]?=?[i/count] ????print('data:',?len(data)) ????#?test ????test(data,?'json') ????test(data,?'pickle') ????test(data,?'marshal')if?__name__?==?'__main__': ????main()
以上代碼的測試過程是,對一個有80個key的字典進行序列化和反序列化操作,每個模塊各循環(huán)10000次,統(tǒng)計各自的耗時。用Python3.6跑出的結(jié)果如下:
json?dumps?time?cost:?30.436348915100098 json?loads?time?cost:?10.900368928909302 pickle?dumps?time?cost:?1.7617356777191162 pickle?loads?time?cost:?2.8096134662628174 marshal?dumps?time?cost:?1.8232548236846924 marshal?loads?time?cost:?1.991441011428833
由此看出,pickle的性能最好,json最慢。
猿人學Python是一個不錯的學習網(wǎng)站,感興趣的可以關(guān)注公眾號或是網(wǎng)站
python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。