1. 闲扯一下:文件

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

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

平日里,大家接触到的更多的是二进制文件,比如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()

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

python学习笔记整理于猿人学网站的python基础教程

最新文章

  1. 9.27js拓展、bootstrap菜鸟教程
  2. Http简析
  3. 虚拟机开机提示:This virtual machine appears to be in use
  4. Java 7爆最新漏洞,10年前的攻击手法仍有效
  5. mysqld_multi配置MySQL多实例
  6. Java学习----你可以知道对象的工作结果(获取方法的返回值)
  7. 201521123057 《Java程序设计》第4周学习总结
  8. 用Eclipse 搭建一个Maven Spring SpringMVC 项目
  9. 我的游戏学习日志3——三国志GBA
  10. git批量删除文件和批量提交
  11. 对比各节点host 与 标准节点host差异脚本
  12. pyinstller的安装
  13. Lambda表达式树
  14. 搭建 Node.js 环境
  15. .NET中使用FastReport实现打印功能
  16. SV中的数据类型
  17. LaiFeng-code
  18. 包学会之浅入浅出Vue.js:结业篇
  19. OPC and .NET
  20. Juniper SRX防火墙简明配置手册(转)

热门文章

  1. 禁止CSRF校验实例
  2. 【Leetcode_easy】762. Prime Number of Set Bits in Binary Representation
  3. Mysql开启审计功能
  4. 【ARTS】01_31_左耳听风-201900610~201900616
  5. 2019年11月27日 Linux所学知识 总结
  6. Memcached集群实现及原理介绍
  7. jmeter边界提取器实现数据依赖
  8. springboot下html的js中使用shiro标签功能
  9. [CF369E]Valera and Queries_离线_树状数组
  10. activate-power-mode安装与设置