python3基础之--对象序列化

  关于python对象的序列化大家一定不陌生. marshal模块, pickle模块, json模块, 都可以进行对象的序列化. luffy这里不去详细介绍这三种, 重点关注pickle模块和json模块的一些区别和各自的优势.

pickle vs marshal

python有一个更原始的序列化工具marshal, marshal 的存在主要是为了支持pyc文件, 绝大多数情况下推荐使用pickle

  1. pickle会追踪已经序列化的对象, 不会重复序列化, 而marshal不是;
  2. marshal不能用于序列化用户自定义的类和对象, pickle对类和对象的序列化对于用户是透明的, 即用户不用关注是否是自定义的.
  3. marshal序列化格式不保证在python各版本之间的迁移, 而pickle对于python各版本是向后兼容的.

pickle vs Json

 pickle和Json有着本质的区别, 虽然两者都可以序列化.

  1. Json文本序列化格式, Json输出的是Unicode文本(大多数时候按照utf-8格式编码), 而pickle是二进制序列化格式, 输出的是二进制流.
  2. Json的输出是可读的(文本形式, 不论是写到文件还是打印出来), 而pickle的输出是不可读的.
  3. Json广泛用于各种语言之间的数据交互, 尤其是通过网络传输数据应用广泛. 而pickle只用于python应用.
  4. Json默认只能支持有限的python内置数据类型(比如字典, list, tuple等), 而pickle可以支持extremely large number of python types, 大部分可以自动序列化, 部分复杂情况可以通过一些办法来处理.

举个栗子

 看起来Json似乎更优, 不论是可读性还是应用的广泛性, Json都完爆呀! 但是下面的例子情况完全相反.
目标: 将一个100x100的矩阵(一张灰度图)存储到文件中.

img = np.random.randint(low=0, high=256, size=(1920,1080), dtype='uint8')

  1. 使用Json:
f = open('a_json.dmp', mode='w', encoding='utf-8')  
json.dump(img.tolist(), f)      #Json不支持ndarray序列化, 必须先转成其支持的格式, 比如list
f.close()
  1. 使用pickle
f = open('./a_pickle.dump', mode='wb')
pickle.dump(img, f, 3)
f.close()

查看文件大小:
在这里插入图片描述
pickle序列化文件大小只有Json文件的不到1/4. pickle完爆呀!

简单来讲下原因:
对于一个数字255的序列化

  • Json的方式: 把255按照字符串来处理, 也就是说需要3个utf-8编码来表示255, 需要3个byte;
  • pickle的方式: 255的16进制是\xff, 也就是二进制的11111111, 只需要1个byte.

当然, pickle需要同时序列化一些对象结构的信息, 所以在数组很小的时候pickle体现不出优势.

总结

 在存储大规模的数字矩阵, 或者各种类型的对象的时候, 无疑是pickle更胜一筹, 但是涉及到数据在网络上的传输并且跨语言的时候, pickle就无能为力了, Json无疑是非常好的选择.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值