最近用Python時,遇到了序列化對象的問題,傳統的json和新型序列化工具包msgpack都有涉及,於是做一個簡單的總結:
通俗的講:序列化:將對象信息轉化為可以存儲或傳輸的形式;反序列化:把這個存儲的內容還原成對象。
json就不用多做解釋了,是一種輕量級的數據交換格式,廣泛應用於web開發中。當然也是將對象序列化成符合json規范的格式。網上有一堆堆資料。
msgpack就有意思了,先看下官方解釋:
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages
like JSON. But it’s faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
MessagePack 是一個高效的二進制序列化格式。它讓你像JSON一樣可以在各種語言之間交換數據。但是它比JSON更快、更小。小的整數會被編碼成一個字節,短的字符串僅僅只需要比它的長度多一字節的大小。
總結一句:就是作用和json一樣,就是比json更強:更快,更小!
我這里主要基於實際python中的使用,對比一下兩種序列化效果。具體細節這位兄弟的博客講解比較詳細:http://www.heyues.com/messagepack/
好的,不管別人說的多么牛逼,還是要用自己代碼試一試,才是看的到的嘛,簡單寫了一個測試腳本:
對一個字典對象,用json和msgpack分別序列化、反序列化10000次,觀察速度和序列化之后的內存占用。
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)
結果:
不得不說,從大小上面和耗時上面,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肯定會用在越來越多的數據傳輸中。