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

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

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

下面咱們一塊兒來看看,python裏面序列化經常使用的json、 pickle 、marshal工具。以及他們之類的一些功能對比。算法

1. 閒扯一下:文件

平日裏,你們接觸到的更多的是二進制文件,好比word文檔,圖片,視頻,音頻等。爲了保存和讀取這些不一樣文件,各自都規定了各自的文件格式,這些格式是各自存儲的規範。同時爲了讓保存的文件更小便於傳輸(好比,視頻經過網絡傳輸),各自還經過一些算法對文件數據進行壓縮,尤爲是圖片、視頻和音頻都各自有不少壓縮算法,好比圖片的jpg,音頻的mp3,視頻的mkv這些即表明了相應的文件格式,還表明了其背後的壓縮算法。這些多媒體數據的壓縮算法的原則是,在保證媒體質量的前提下儘可能使得數據存儲量小。json

除了文件自己的一些壓縮算法,咱們還常常使用一些通用的壓縮軟件對文件進行打包和壓縮,好比zip,WinRAR等。網絡

磁盤上的數據,咱們通常稱爲 「文件」 ,通常不一樣的文件都有各自的後綴名,好比 .txt .docx .xlsx .jpg .mp3 .avi 。這些不一樣類型的文件通常分爲兩大類:app

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

 

 

2. 回到原題:Python序列化

咱們使用python時,常常用到的數據就是int,float,string,list, dict,tuple這些內置的數據類型和結構。寫程序時,咱們極可能但願把這些基本數據存儲到硬盤,即保存存儲結果。這個過程,咱們稱之爲「序列化」工具

Python裏面經常使用的序列化工具備:oop

  • 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/

相關文章
相關標籤/搜索