学习笔记:Python序列化常用工具及性能对比

1. 闲扯一下:文件

磁盘上的数据,我们一般称为 “文件” ,一般不同的文件都有各自的后缀名,比如 .txt .docx .xlsx .jpg .mp3 .avi 。这些不同类型的文件一般分为两大类:

文本文件: 用记事本打开看到的是英文、发文、中文等字符;

二进制文件: 用记事本打开看到的可能就是一堆乱码;

 

学习笔记:Python序列化常用工具及性能对比

平日里,大家接触到的更多的是二进制文件,比如word文档,图片,视频,音频等。为了保存和读取这些不同文件,各自都规定了各自的文件格式,这些格式是各自存储的规范。同时为了让保存的文件更小便于传输(比如,视频通过网络传输),各自还通过一些算法对文件数据进行压缩,尤其是图片、视频和音频都各自有很多压缩算法,比如图片的jpg,音频的mp3,视频的mkv这些即代表了相应的文件格式,还代表了其背后的压缩算法。这些多媒体数据的压缩算法的原则是,在保证媒体质量的前提下尽量使得数据存储量小。

除了文件本身的一些压缩算法,我们还经常使用一些通用的压缩软件对文件进行打包和压缩,比如zip,WinRAR等。

2. 回到原题:Python序列化

我们使用python时,经常用到的数据就是int,float,string,list, dict,tuple这些内置的数据类型和结构。写程序时,我们很可能希望把这些基本数据存储到硬盘,即保存存储结果。这个过程,我们称之为“序列化”

Python里面常用的序列化工具有:

json

pickle

marshal

cPickle是pickle的C语言实现,速度更快,但Python3里面的pickle就是C语言实现的,因此不再包含cPickle模块。

json在web中使用更为广泛,是各种web API的首选数据格式。

以上三种工具,哪一个更快呢?

#!/usr/bin/env python import time import json import pickle import marshal def test(data, method): if method == 'json': dumps = json.dumps loads = json.loads elif method == 'pickle': dumps = pickle.dumps loads = pickle.loads elif method == 'marshal': dumps = marshal.dumps loads = marshal.loads b = time.time() s = '' loop = 10000 for i in range(loop): s = dumps(data) print('{} dumps time cost: {}'.format(method, time.time() - b)) b = time.time() for i in range(loop): loads(s) print('{} loads time cost: {}'.format(method, time.time() - b)) def main(): # generate test data data = {} count = 80 for i in range(10000): k = '%05d' % (i % count) if k in data: data[k].append(i / count) else: data[k] = [i/count] print('data:', len(data)) # test test(data, 'json') test(data, 'pickle') test(data, 'marshal') if __name__ == '__main__': main()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssdgp.html