什麼叫序列化?簡單來說就是將內存中的變量數據轉而存儲到磁盤上或是經過網絡傳輸到遠程。python
反序列化是指:把變量數據從序列化的對象從新讀到內存裏。web
下面咱們一塊兒來看看,python裏面序列化經常使用的json、 pickle 、marshal工具。以及他們之類的一些功能對比。算法
平日裏,你們接觸到的更多的是二進制文件,好比word文檔,圖片,視頻,音頻等。爲了保存和讀取這些不一樣文件,各自都規定了各自的文件格式,這些格式是各自存儲的規範。同時爲了讓保存的文件更小便於傳輸(好比,視頻經過網絡傳輸),各自還經過一些算法對文件數據進行壓縮,尤爲是圖片、視頻和音頻都各自有不少壓縮算法,好比圖片的jpg,音頻的mp3,視頻的mkv這些即表明了相應的文件格式,還表明了其背後的壓縮算法。這些多媒體數據的壓縮算法的原則是,在保證媒體質量的前提下儘可能使得數據存儲量小。json
除了文件自己的一些壓縮算法,咱們還常常使用一些通用的壓縮軟件對文件進行打包和壓縮,好比zip,WinRAR等。網絡
磁盤上的數據,咱們通常稱爲 「文件」 ,通常不一樣的文件都有各自的後綴名,好比 .txt .docx .xlsx .jpg .mp3 .avi 。這些不一樣類型的文件通常分爲兩大類:app
咱們使用python時,常常用到的數據就是int,float,string,list, dict,tuple這些內置的數據類型和結構。寫程序時,咱們極可能但願把這些基本數據存儲到硬盤,即保存存儲結果。這個過程,咱們稱之爲「序列化」工具
Python裏面經常使用的序列化工具備:oop
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/