博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python下Json和Msgpack序列化比较
阅读量:4580 次
发布时间:2019-06-09

本文共 2465 字,大约阅读时间需要 8 分钟。

 

   最近用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,timea = {'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 = unpackloads = unpackbdump = packdumps = 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
content: {"age": 26, "location": "Shenzhen", "name": "yzy", "gender": "male"} size: 117
content: {'age': 26, 'location': 'Shenzhen', 'name': 'yzy', 'gender': 'male'} size: 288Msgpack serialization time: 0.05043 seconds
content: b'\x84\xa3age\x1a\xa8location\xa8Shenzhen\xa4name\xa3yzy\xa6gender\xa4male' size: 78
content: size: 288

这样看来,msgpack还是有很大潜力的。虽然现在现存的系统大都适用json,但随着发展,包括Redis等对msgpack的支持,msgpack肯定会用在越来越多的数据传输中。

转载于:https://www.cnblogs.com/DjangoBlog/p/6686998.html

你可能感兴趣的文章
Mariadb3—多表查询
查看>>
分享到新浪,空间,微博等的代码
查看>>
nsmutableset
查看>>
JS-BOM编程之history对象
查看>>
ofstream和ifstream详细用法
查看>>
MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法
查看>>
20171027工作日记--今天搜索的问题
查看>>
第四次迭代目标
查看>>
Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据...
查看>>
elasticsearch2.x线程池配置
查看>>
TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码...
查看>>
写一个标准宏MIN,输入两个参数,返回较小的
查看>>
跟我一起学Git (十) Patches【转】
查看>>
[译]Vulkan教程(24)索引buffer
查看>>
swfupload 参数说明
查看>>
test for windows live writer plugins
查看>>
Ext + java 显示数据库中的二进制图片
查看>>
TensorFlow 深度学习笔记 Stochastic Optimization
查看>>
最全的PHP常用函数大全
查看>>
8 种提升 ASP.NET Web API 性能的方法
查看>>