zoukankan      html  css  js  c++  java
  • 学习笔记:Python序列化常用工具及性能对比

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

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

    下面我们一起来看看,python里面序列化常用的json、 pickle 、marshal工具。以及他们之类的一些功能对比。

    1. 闲扯一下:文件

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

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

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

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

     

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

      

    以上代码的测试过程是,对一个有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/

  • 相关阅读:
    Unity3D Editor模式下批量修改prefab
    3D touch在Unity3D中的使用
    Unity中的协程是什么?
    Unity3D脚本调用Objective C代码实现游戏内购买
    WindowsPhone8拍照功能实现简介
    WindowsPhone App如何扩展能够使用的内存
    SVN 提交代码时提示文件已经存在解决办法
    iOS检查App新版本并更新新版本
    iOS存储数据字典到沙盒
    统计整个Xcode工程代码行数
  • 原文地址:https://www.cnblogs.com/amiza/p/10368759.html
Copyright © 2011-2022 走看看