• Python下Json和Msgpack序列化比较


       最近用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'x84xa3agex1axa8locationxa8Shenzhenxa4namexa3yzyxa6genderxa4male' size:  78
    <class 'dict'> content:   size:  288

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

  • 相关阅读:
    python 如何将md5转为16字节
    linux非root用户执行开机启动程序
    python 正则表达式的使用
    Go随机数的使用
    Go 的类型断言type assertion
    go get中的...
    Go语言圣经
    python入门第三十五天--事件驱动模型(补)练习理解
    MySQL_Ubuntu安装
    JAVA入门基础--数据类型
  • 原文地址:https://www.cnblogs.com/yuanzhaoyi/p/6093362.html
Copyright © 2020-2023  润新知