Python下Json和Msgpack序列化比較


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

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

json就不用多做解釋了,是一種輕量級的數據交換格式,廣泛應用於web開發中。當然也是將對象序列化成符合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/

我這里主要基於實際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肯定會用在越來越多的數據傳輸中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM