前言※
最近在做毕设,需要读取处理大量的数据,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) |
---|---|---|---|
Json | 147.63 | 246.74 | 4.32 |
Pickle | 32.94 | 29.43 | 2.20 |
Msgpack | 31.84 | 19.19 | 2.19 |
结果供参考,欢迎交流。