最近用Python時,遇到了序列化對象的問題,傳統的json和新型序列化工具包msgpack都有涉及,因而作一個簡單的總結:python
通俗的講:序列化:將對象信息轉化爲能夠存儲或傳輸的形式;反序列化:把這個存儲的內容還原成對象。web
json就不用多作解釋了,是一種輕量級的數據交換格式,普遍應用於web開發中。固然也是將對象序列化成符合json規範的格式。網上有一堆堆資料。json
官網:http://www.json.org工具
msgpack就有意思了,先看下官方解釋:測試
官網:http://msgpack.org/ui
我這裏主要基於實際python中的使用,對比一下兩種序列化效果。具體細節這位兄弟的博客講解比較詳細:http://www.heyues.com/messagepack/編碼
好的,無論別人說的多麼牛逼,仍是要用本身代碼試一試,纔是看的到的嘛,簡單寫了一個測試腳本:spa
對一個字典對象,用json和msgpack分別序列化、反序列化10000次,觀察速度和序列化以後的內存佔用。code
import json,msgpack,sys,time a = {'name':'yzy','age':26,'gender':'male','location':'Shenzhen'} begin_json = time.clock() for i in range(10000): in_json = json.dumps(a) un_json = json.loads(in_json) end_json = time.clock() print('Json serialization time: %.05f seconds' %(end_json-begin_json)) print (type(in_json),'content: ',in_json,'size: ',sys.getsizeof(in_json)) print (type(un_json),'content: ',un_json,'size: ',sys.getsizeof(un_json)) begin_msg = time.clock() for i in range(10000): in_msg = msgpack.packb(a) un_msg = msgpack.unpackb(in_msg) """ # alias for compatibility to simplejson/marshal/pickle. load = unpack loads = unpackb dump = pack dumps = packb """ # in_msg1 = msgpack.dumps(a) # un_msg1 = msgpack.loads(in_msg) end_msg = time.clock() print('Msgpack serialization time: %.05f seconds' %(end_msg-begin_msg)) print (type(in_msg),'content: ',in_msg,'size: ',sys.getsizeof(in_msg)) print (type(un_msg),'content: ','size: ',sys.getsizeof(un_msg)
結果:orm
不得不說,從大小上面和耗時上面,msgpack的確有明顯優點。
就我本身的測試而言,速度至少快了3倍多。
Json serialization time: 0.16115 seconds <class 'str'> content: {"age": 26, "location": "Shenzhen", "name": "yzy", "gender": "male"} size: 117 <class 'dict'> content: {'age': 26, 'location': 'Shenzhen', 'name': 'yzy', 'gender': 'male'} size: 288 Msgpack serialization time: 0.05043 seconds <class 'bytes'> content: b'\x84\xa3age\x1a\xa8location\xa8Shenzhen\xa4name\xa3yzy\xa6gender\xa4male' size: 78 <class 'dict'> content: size: 288
這樣看來,msgpack仍是有很大潛力的。雖然如今現存的系統大都適用json,但隨着發展,包括Redis等對msgpack的支持,msgpack確定會用在愈來愈多的數據傳輸中。