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基础教程

Python内存数据序列化到硬盘上哪家强的更多相关文章

  1. 【转】Python之数据序列化(json、pickle、shelve)

    [转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...

  2. Python之数据序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  3. python记录_day22 序列化

    序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受bytes 一.pickle 把python对象写入到文件中的一种解决方案,但是写入到文件 ...

  4. 20201214-1 Json与pickle数据序列化

    1-1 文件处理时,只能存字符串或者二进制 info = { 'name':'alex', 'age':22 } f = open("test.text", "w&quo ...

  5. cpu,内存,虚拟内存,硬盘,缓存之间是什么关系??

    1.CPU即中央处理器,是英语“Central Processing Unit”的缩写.CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作 ...

  6. redis内存数据的持久化方式

    转: http://blog.csdn.net/wzqzhq/article/details/64920996 概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis ...

  7. linux查询操作系统信息,CPU物理个数,CPU核心数,逻辑CPU数,内存信息查询,硬盘信息查询

    目录 一.前言 二.关于服务器基本配置 2.1 操作系统基本配置查询 2.2 CPU基本配置查询 2.3 内存基本配置查询 2.4 硬盘基本配置查询 一.前言 ​ 当我们接手了一台或者几台服务器的时候 ...

  8. python第四周:装饰器、迭代器、内置方法、数据序列化

    1.装饰器 定义:本质是一个函数,(装饰其他函数)就是为其他函数添加附加功能 原则:不能修改被装饰函数的源代码,不能修改被装饰函数的调用方式 实现装饰器的知识储备: 函数即“变量”.每当定义一个函数时 ...

  9. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

随机推荐

  1. c# 结构体struct注意事项

    c# 结构struct注意事项 1,不能定义无参构造函数,因为隐式的默认无参构造函数不能被重写 2,当为某个结构编写带有参数的构造函数时,必须显式初始化所有成员,否则编译不过. 3,不允许在结构的实例 ...

  2. DTCMS会员中心添加新页面

    首先将模板文件spend_list.html放到模板文件夹 URL配置里 将需要在此页面传递的参数,在“添加表达式”中配置好 链接写法: 继承类名DTcms.Web.UI.Page.spend_lis ...

  3. 高级UI-RecyclerView间隔线添加

    上文讲到了RecyclerView的简单使用,知道RecycleView是怎么使用的了,那么这一节将基于上一届的内容继续改进,在ListView中很轻松就能实现的间隔线,在RecycleView中也需 ...

  4. (生鲜项目)07. api view实现商品列表页

    第一步: 环境配置 1. DRF官网: https://www.django-rest-framework.org/ 仔细查看自己当前的python版本以及django版本是否支持DRF, 然后就看看 ...

  5. Mac OS X下把 /etc/sudoers 写错了怎么办?(转载https://blog.csdn.net/robertsong2004/article/details/53725285)

    重要的事情先说一下,首先为了回避这个问题,一定要用 visudo 来改 /etc/sudoers 文件. 问题描述: 1. 用  sudo vi 直接改 /etc/sudoers 并覆盖原文件. 2. ...

  6. Java面试 - == 和 equals 的区别?

    ==:如果比较的对象是基本数据类型,则比较的是数值是否一致:如果比较的是引用数据类型,则比较的是对象的地址值是否一致. equals():equals()方法不能用于比较基本数据类型的对象,如果对象和 ...

  7. layer弹出层,结合art-template实现弹出编辑

    模板 <!-- 模板 --> <script id="render-tpl" type="text/html"> <div cla ...

  8. 20191011-构建我们公司自己的自动化接口测试框架-Util的TestDataHandler模块

    TestDataHandler模块主要是做测试数据的处理,包括转换数据格式和变量参数处理转换数据格式函数: data是数据,data以$()的方式识别变量,如果请求的数据有变量,则将变量用global ...

  9. odoo——日历的一对多与多对一

    # model文件 # -*- coding: utf-8 -*- from odoo import api, fields, models class TodoTestYear(models.Mod ...

  10. 2019杭电多校一 L. Sequence (NTT)

    大意: 给定序列$a$, 给定$m$个操作, 求最后序列每一项的值. 一共$3$种操作, 其中第$k$种操作将序列变为$b_i=\sum\limits_{j=i-kx}a_j$, $(0\le x,1 ...