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

什么叫序列化?简单来说就是将内存中的变量数据转而存储到磁盘上或是经过网络传输到远程。python

反序列化是指:把变量数据从序列化的对象从新读到内存里。web

下面咱们一块儿来看看,python里面序列化经常使用的json、 pickle 、marshal工具。以及他们之类的一些功能对比。算法

1. 闲扯一下:文件

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

除了文件自己的一些压缩算法,咱们还常常使用一些通用的压缩软件对文件进行打包和压缩,好比zip,WinRAR等。网络

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

  • 文本文件: 用记事本打开看到的是英文、发文、中文等字符;
  • 二进制文件: 用记事本打开看到的可能就是一堆乱码;

 

 

2. 回到原题:Python序列化

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

Python里面经常使用的序列化工具备:oop

  • 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()

  

以上代码的测试过程是,对一个有80个key的字典进行序列化和反序列化操做,每一个模块各循环10000次,统计各自的耗时。用Python3.6跑出的结果以下:

json dumps time cost: 30.436348915100098
json loads time cost: 10.900368928909302
pickle dumps time cost: 1.7617356777191162
pickle loads time cost: 2.8096134662628174
marshal dumps time cost: 1.8232548236846924
marshal loads time cost: 1.991441011428833

  

由此看出,pickle的性能最好,json最慢。

 

 

如无特殊说明,本文为本站原创,出处:https://www.yuanrenxue.com/

相关文章
相关标签/搜索