专栏名称: 爬虫俱乐部
Stata技术控,编程技术咨询,数据讨论与分享,编程和实证培训。
目录
相关文章推荐
AustinDatabases  ·  临时工:数据库人生路,如何救赎自己 -- ... ·  11 小时前  
数据分析与开发  ·  马斯克被“打脸”?150岁老人领社保,竟是程 ... ·  4 天前  
51好读  ›  专栏  ›  爬虫俱乐部

pickle 更快的数据储存方式

爬虫俱乐部  · 公众号  ·  · 2018-06-19 10:15

正文

暑期Stata培训班招生啦!!! 接力线上的网课培训,我们在今夏又开始新一轮的线下培训啦! 8月4日至12日 ,爬虫俱乐部期待与您的相遇!培训具体内容详见推文《 暑期Stata编程技术定制培训班 》。

有问题,不要怕!点击推文底部“ 阅读原文 ”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱 [email protected] ,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是: https://stata-club.github.io ,粉丝们可以通过该网站访问过去的推文哟~

好消息 :爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!


在之前的python系列推文中,我们介绍了文件读写系列函数,也介绍了诸多python中的原生数据类型,这是每一个学习python语言的人都应该掌握的知识。而如果你正逐渐将自己的数据处理工作转移到python上来,就会面临一个首要的问题———— 如何妥善保存 python中产生的数据,如一个列表,若干个字典。很多人会选择将数据写入一个文本文档,使用时再将之读入。这固然是一种解决办法,但不够“ 优雅 ”,今天我们将会介绍一种优雅的python读写数据对象的方式: pickle模块

对象的序列化(serialization)与反序列化(deserialization)

我们曾经提到,python中的所有数据类型(如列表、字典)的实例化 ( 一个 列表 a = [1,2,3] ,一个 字典 dicta = {'name':'tom' } ) 都可看作是一个对象( object ),对象通常是一种逻辑上的实体,比如一个班级名单列表,以一个list的形式给出,则它是一个对象,一个摩尔斯电码词典,以一个dict的形式给出,则它也是一个对象,当我们想将一个列表中的信息存储下来,以备下次工作时使用时,我们也许会用文件读写函数来完成,如:

classlist = ['tom','karry','bob']

with open("classlist.txt","w+") as f:
    for name in classlist:
        f.write(name+'\n')

通过使用读写函数,我们将该列表的内容分行写入一个名为 classlist 的列表中。当下次使用时再分行读入。

但python存在着专门读写python对象的方法,那就是 pickle 模块,用于解决对象的序列化与反序列化。所谓 序列化 指的是将python的对象转化为一种专门的 二进制 字符串,并将其以二进制形式写入一个文件中,而 反序列化 则是读取该二进制文件并将其 转化回对象本身 。这样子做有什么好处呢?最显而易见的是它的存储与读写速度会非常的快,后面我们会给出示例说明。其次创立专门的对象数据文件,可以防止数据被不小心修改,产生问题。

pickle模块在标准库内,引入pickle模块很简便。

import pickle

pickle dump

将对象转化为二进制存储文件使用的是pickle模块的 dump 方法,现在我们将一个长度为 100 的列表序列化并保存。

import random
import pickle

a = [random.random() for x in range(100)]

with open("alist.pkl",'wb') as f:
    pickle.dump(a,f)

可以看到,与一般的文件读写不同的是,我们的读写方式为 wb ,也就是二进制方式书写, pickle.dump 方法接收两个必需的参数, 第一个 是要序列化的 对象 第二个 是二进制文件 句柄 。执行完毕后,当前工作目录会多出来一个名为 alist.pkl 的文件,需要说明的是,pkl只是一个形式上的后缀名,你可以写成任何其它字符,但为了显示它是一个pickle序列化的数据对象,我们使用 pkl 作为标记。

pickle load

有读入就会有读取,将pkl文件读取为对象使用的是pickle模块的dump方法,现在我们将刚刚存储的数据文件读取

with open("alist.pkl",'rb') as f:
    abak = pickle.load(f)

通过这个样子即可反序列化pkl文件,变成python的列表对象。

更快的速度与更小的体积

在第一节中我们提到,使用pickle来读写对象,其效率更高,我们使用 time 模块验证一下

In [27]: import time

In [28]: a = [random.random() for x in range(100000)]

In [29]: with open("filewrite.txt",'w') as f:
    ...:     starttime = time.time()
    ...:     for num in a:
    ...:         f.write(str(num)+'\n')
    ...:     filetime = time.time() - starttime
    ...:

In [30]: filetime
Out[30]: 0.32804441452026367

In [31]: with open("pklwrite.pkl",'wb') as f:
    ...:     starttime = time.time()
    ...:     pickle.dump(a,f)
    ...:     pkltime = time.time() - starttime
    ...:

In [32]: pkltime
Out[32]: 0.10946011543273926

可以看到,对于同样读写一个长度为100000的列表对象,使用文件读写函数所花的时间是使用了pickle模块的 三倍多 ,当文件对象越大,差距也会越大。

我们可以查看两个文件的大小,filewrite.txt 的大小为 1980kb ,而pklwrite.pkl仅有 880kb ,在分别打包为rar文件后,大小分别为 863kb 780kb, 这说明序列化对象同样减少了数据存储的空间,使用pickle模块存储python数据对象是既省时间又省空间的更优雅的方法。


注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。 另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~




文字编辑:赵宇亮

技术总编:刘贝贝

往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6. Mata中的数据导出至Excel

7. 谈谈图形中坐标设置的技巧

8. 如何输出某个关键词在字符串中的所有位置?







请到「今天看啥」查看全文