最近用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肯定会用在越来越多的数据传输中。

Python下Json和Msgpack序列化比较的更多相关文章

  1. Python 下JSON的两种编解码方式实例解析

    概念   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...

  2. Python的json and pickle序列化

    json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = ...

  3. Python下json中文乱码解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,只需要 #coding=utf8 import json js = json.loads('{" ...

  4. Python进行JSON格式化输出,以及汉字显示问题

    格式化输出 转载地址  https://blog.csdn.net/real_tino/article/details/76422634 问题分析: Python下json手法的json在打印查看时, ...

  5. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  6. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  7. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  8. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  9. python开发模块基础:序列化模块json,pickle,shelve

    一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...

随机推荐

  1. Cordova应用程序修改启动画面或者Icon

    1)  制作启动画面图片或icon ionic resources //同时生成icon和splash ionic resources --icon //只生成icon ionic resources ...

  2. pureftp在centos下与MySQL搭配使用

    概述 pure-ftpd是linux下的一个ftp服务端,据说安全性较高.我在centos6下用yum安装pure-ftpd,并配置了通过MySQL进行用户的增删改查,以及对应到apache的web目 ...

  3. mysql 查询制定日期数据

    //获取昨天更新数据的条件date_sub(current_date(), interval 1 day) = from_unixtime(senddate, '%Y-%m-%d') 注释:date_ ...

  4. C 语言中 malloc、calloc、realloc 和free 函数的使用方法

    C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自 ...

  5. URL.createObjectURL和URL.revokeObjectURL

    一.URL.createObjectURL URL.createObjectURL()方法会根据传入的参数创建一个指向该参数对象的URL. 这个URL的生命仅存在于它被创建的这个文档里,新的对象URL ...

  6. oracle用户创建

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. G:\Users\Admin>sqlplus ...

  7. 关于Nginx的一些优化(突破十万并发)

    nginx指令中的优化(配置文件) worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity 00000001 00 ...

  8. applicationContext.xml

    <bean id="dataSource" parent="parentDataSource"> <property name="u ...

  9. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  10. 高可用mysql之MHA的原理

    MHA 如何工作的? MHA是如何工作的? ============================================================================== ...