最近用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. ASP.NET MVC 应用,站点发布到本地IIS

    材料准备 visual studio 2013 , iis 7 具体步骤 1.以管理员身份启动visual studio 2.新建项目 web app 或者站点 3.编译项目 4.右击项目选择publ ...

  2. 基于python的selenium自动化测试环境安装

    1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...

  3. Linux编译工具:gcc入门

    1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还 ...

  4. 【BZOJ-1127】KUP 悬线法 + 贪心

    1127: [POI2008]KUP Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 317  Solved: 11 ...

  5. 【bzoj4518】 Sdoi2016—征途

    http://www.lydsy.com/JudgeOnline/problem.php?id=4518 (题目链接) 题意 给出n个连续的整数,求将它们分成m段,求最小方差*m^2. Solutio ...

  6. 爬虫框架--webmagic

    官方有详细的使用文档:http://webmagic.io/docs/zh/ 简介:这只是个java爬虫框架,具体使用需要个人去定制,没有图片验证,不能获取js渲染的网页,但简单易用,可以通过xpat ...

  7. js修改伪类的值

    css文件 p.change:after { content: attr(data-content); } js文件 $(this).addClass('change').attr('data-con ...

  8. UVA1585

    #include<stdio.h> #include<string.h> int main(){ int n; ]; scanf("%d",&n); ...

  9. sql笨办法同步数据

    Helpers.SqlHelper sqlHelper = new Helpers.SqlHelper("server=***;database=Cms;user id=sa;passwor ...

  10. CentOS 7.1编译安装PHP7

    原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 1 创 ...