Python下Json和Msgpack序列化比较
最近用Python时,遇到了序列化对象的问题,传统的json和新型序列化工具包msgpack都有涉及,于是做一个简单的总结:
通俗的讲:序列化:将对象信息转化为可以存储或传输的形式;反序列化:把这个存储的内容还原成对象。
json就不用多做解释了,是一种轻量级的数据交换格式,广泛应用于web开发中。当然也是将对象序列化成符合json规范的格式。网上有一堆堆资料。
msgpack就有意思了,先看下官方解释:
我这里主要基于实际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肯定会用在越来越多的数据传输中。
Python下Json和Msgpack序列化比较的更多相关文章
- Python 下JSON的两种编解码方式实例解析
概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...
- Python的json and pickle序列化
json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = ...
- Python下json中文乱码解决办法
json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,只需要 #coding=utf8 import json js = json.loads('{" ...
- Python进行JSON格式化输出,以及汉字显示问题
格式化输出 转载地址 https://blog.csdn.net/real_tino/article/details/76422634 问题分析: Python下json手法的json在打印查看时, ...
- Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能 原则: 1.不能修改被装饰的函数的源代码. 2.不 ...
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- python基础6之迭代器&生成器、json&pickle数据序列化
内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- python开发模块基础:序列化模块json,pickle,shelve
一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...
随机推荐
- java学习笔记之正则表达式
一般来说,正则表达式就是以某种方式来描述字符串,因此你可与说:"如果一个字符串符合有这些东西,那么它就是我正在找的东西. 1.要找一个数字,如果它可能有一个负号在最前面(可能没有,没有也是匹 ...
- C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)
动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程 ...
- Bitmap转换成BitmapImage
public BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap) { MemoryStream ms = new MemoryS ...
- 遍历hashMap的两种方式
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- 逆向工程学习第一天--一个VC6编译的小程序
今天开始研究二进制了,开个文记录一下.下面是一个小程序的OD反汇编代码,自己尝试加了注释,本人逆向零基础,属于摸着石头过河的类型,有理解错误的地方,希望大牛不吝赐教. 源代码: #include< ...
- meta_value与meta_value_num的区别(排序)
[meta_value与meta_value_num] //'meta_value' - 注意'meta_key=keyname' 必须也出现在查询中. 注意排序是按照字母表顺序进行的.(如:word ...
- ASP.MVC时间类型json数据处理
服务端返回DateTime属性如果用自带的json方法返回的数据如下: 有2种办法解决一种是采用服务端解决方案,一种是使用前端解决方案 1.前端解决方案 第一步:对Date进行扩展 // 对Date的 ...
- Jquery 插件\Js 插件收集
1.linq.js 使得js 的数组像c#的linq操作一下样 http://linqjs.codeplex.com/ 2.分页插件 https://github.com/mricle/Mricode ...
- 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...
- MySQL自增ID 起始值 修改方法
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法. 通常的设置自增字段的方法: 创建表格时 ...