學習筆記:Python序列化常用工具及性能對比


什么叫序列化?簡單來講就是將內存中的變量數據轉而存儲到磁盤上或是通過網絡傳輸到遠程。

反序列化是指:把變量數據從序列化的對象重新讀到內存里。

下面我們一起來看看,python里面序列化常用的json、 pickle 、marshal工具。以及他們之類的一些功能對比。

1. 閑扯一下:文件

平日里,大家接觸到的更多的是二進制文件,比如word文檔,圖片,視頻,音頻等。為了保存和讀取這些不同文件,各自都規定了各自的文件格式,這些格式是各自存儲的規范。同時為了讓保存的文件更小便於傳輸(比如,視頻通過網絡傳輸),各自還通過一些算法對文件數據進行壓縮,尤其是圖片、視頻和音頻都各自有很多壓縮算法,比如圖片的jpg,音頻的mp3,視頻的mkv這些即代表了相應的文件格式,還代表了其背后的壓縮算法。這些多媒體數據的壓縮算法的原則是,在保證媒體質量的前提下盡量使得數據存儲量小。

除了文件本身的一些壓縮算法,我們還經常使用一些通用的壓縮軟件對文件進行打包和壓縮,比如zip,WinRAR等。

磁盤上的數據,我們一般稱為 “文件” ,一般不同的文件都有各自的后綴名,比如 .txt .docx .xlsx .jpg .mp3 .avi 。這些不同類型的文件一般分為兩大類:

  • 文本文件: 用記事本打開看到的是英文、發文、中文等字符;
  • 二進制文件: 用記事本打開看到的可能就是一堆亂碼;

 

 

2. 回到原題:Python序列化

我們使用python時,經常用到的數據就是int,float,string,list, dict,tuple這些內置的數據類型和結構。寫程序時,我們很可能希望把這些基本數據存儲到硬盤,即保存存儲結果。這個過程,我們稱之為“序列化”

Python里面常用的序列化工具有:

  • json
  • pickle
  • marshal

cPickle是pickle的C語言實現,速度更快,但Python3里面的pickle就是C語言實現的,因此不再包含cPickle模塊。

json在web中使用更為廣泛,是各種web API的首選數據格式。

以上三種工具,哪一個更快呢?

#!/usr/bin/env python

import time
import json
import pickle
import marshal



def 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的字典進行序列化和反序列化操作,每個模塊各循環10000次,統計各自的耗時。用Python3.6跑出的結果如下:

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最慢。

 

 

如無特殊說明,本文為本站原創,出處:https://www.yuanrenxue.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM