Python对象序列化性能比较:pickle、json、msgpack

前言

最近在做毕设,需要读取处理大量的数据,txt中文文本,大概有83万个,多线程读取一次感觉非常慢,想到将读取后的列表序列化一下,保存在本地方便以后使用。之前一直用的pickle,由于处理的都是简单、小型的对象,对性能无感知,但这次处理的对象比较大,查了一下三种用的比较多方法:pickle、json、msgpack,正好对比一下。

三种工具介绍

Pickle

由python标准库提供的序列化方法,可以序列化和反序列化任何python对象。它的优势在于速度快和支持任何python对象,缺点在于仅支持python解码器能解码的二进制数据,因此如果在不同的python版本或者平台之间互操作,可能会出现兼容性问题

Json

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它可以表达基本的数据类型,支持比较复杂的结构及数据集合。它只支持 python 基本数据类型、列表、元组、字典等,只要保证对象有 dict 和 json() 方法就可以序列化为 JSON 格式,易于跨语言传输数据

Msgpack

Msgpack是一个非常高效的二进制序列化格式。它支持基本类型、数组、映射、用户自定义类型等,所以非常适合python对象的序列化。它的具体实现支持定长和不定长的标识符,可以达到高压缩率。常见的rpc和mq框架都使用msgpack作为默认序列化方法。

性能参考(由ChatGPT给出)

速度:msgpack > pickle > json 

通用性:pickle > msgpack > json 

跨语言:json > msgpack > pickle 

压缩效率:msgpack > pickle > json

实际测试

测试条件

序列化对象:python列表 序列化大小:len(list) = 836075 环境:MacBookPro 2017,8+256,python3.9

测试结果

工具序列化用时/(秒)反序列化用时(秒)序列化后文件大小(GB)
Json147.63246.744.32
Pickle32.9429.432.20
Msgpack31.8419.192.19

结果供参考,欢迎交流。


目录