Python下Json和Msgpack序列化比較

   最近用Python時,遇到了序列化對象的問題,傳統的json和新型序列化工具包msgpack都有涉及,因而作一個簡單的總結:python

通俗的講:序列化:將對象信息轉化爲能夠存儲或傳輸的形式;反序列化:把這個存儲的內容還原成對象。web

json就不用多作解釋了,是一種輕量級的數據交換格式,普遍應用於web開發中。固然也是將對象序列化成符合json規範的格式。網上有一堆堆資料。json

官網:http://www.json.org工具

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更強:更快,更小!

官網: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確定會用在愈來愈多的數據傳輸中。

相關文章
相關標籤/搜索