Python的json和pickle模块实现了数据的序列和反序列化。基本上功能使用没有太大区别,方法也同样是dumps/dump和loads/load。

以实际使用示例对比json.dump和pickle.dump的序列的效率和区别。

与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。JSON只能处理基本数据类型。

pickle反序列化后的对象与原对象是等值的副本对象,类似与deepcopy。

Python3.5.2下的使用示例:

import json
import pickle
from time import perf_counter as pc

path = 'subjects.json' # subjects.json 大小 21M
records = [json.loads(line) for line in open(path)]

print(len(records))

t1 = pc()
with open('jsondump.json', 'w') as f:
    json.dump(records, f)
print(pc()-t1)
# jsondump.json 大小 25.1M


t2 = pc()
with open('jsondump_indent.json', 'w') as f:
    json.dump(records, f, indent=4)
print(pc()-t2)
# jsondump_indent.json 大小 35M

t3 = pc()
with open('pickledump.json', 'wb') as f:
    pickle.dump(records, f)
print(pc()-t3)
# jsondump_indent.json 大小 30.7M

运行结果如下:

82040
2.5524479389423504
2.925858650007285
0.5622197479242459

json.dump生成的是文本文件(文件打开为’w’) pickle.dump生成的是二进制文件(文件打开为’wb’)

存储空间对比: 二者占用存储空间相差不大,json.dump生成不带缩进和格式的文件比pickle.dump生成的二进制文件稍小些,但如果生成的是有缩进有格式(indent=4)则会比pickle.dump生成的二进制文件稍大些。

时间对比: pickle.dump生成要比json.dump要快几倍,在我的Mac上是5倍。

以上是json和pickle模块的简单对比,二者有不同的使用场景,实际使用得根据需求选用。