Python下Json和Msgpack序列化⽐较
  最近⽤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中的使⽤,对⽐⼀下两种序列化效果。具体细节这位兄弟的博客讲解⽐较详细:
好的,不管别⼈说的多么⽜逼,还是要⽤⾃⼰代码试⼀试,才是看的到的嘛,简单写了⼀个测试脚本:
对⼀个字典对象,⽤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: ',sizeof(in_json))
print (type(un_json),'content:  ',un_json,'size: ',sizeof(un_json))
begin_msg = time.clock()
for i in range(10000):
in_msg = msgpack.packb(a)
python json字符串转数组
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: ',sizeof(in_msg))
print (type(un_msg),'content:  ','size: ',sizeof(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肯定会⽤在越来越多的数据传输中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。