Pandas读取文件的效率-CSV VS Pickle

读取csv文件

import pandas as pd
csv_path = 'gun_deaths_in_america.csv'
data_csv = pd.read_csv(csv_path,header=0)
data_csv.head()
image.png
data_csv.shape
(100798, 10)
%timeit pd.read_csv(csv_path,header=0)
114 ms ± 5.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

查看文件大小

查看本地文件大小

import os
os.stat('gun_deaths_in_america.csv').st_size # 单位是byte
4824404

查看占用内存大小

data_csv.memory_usage(deep=True).sum()
30368107

查看每一列占用内存大小

  • object 类型占用内存空间很大
  • int/float类型占用内存小
data_csv.memory_usage(deep=True)
Index             80
year          806384
month         806384
intent       6495168
police        806384
sex          6249476
age           806384
race         6322009
hispanic      806384
place        6463070
education     806384
dtype: int64
data_csv.dtypes
year           int64
month          int64
intent        object
police         int64
sex           object
age          float64
race          object
hispanic       int64
place         object
education    float64
dtype: object

保存为Pickle文件

直接保存为Pickle文件

保存为本地文件后,文件大小比原文件大。

data_csv.to_pickle('gun_deaths_in_america_before_transform.pkl')
pkl_path_before = 'gun_deaths_in_america_before_transform.pkl'
os.stat(pkl_path_before).st_size
5656925

对比文件读取速度

pickle文件的读取速度比csv文件读取速度快2倍 !

%timeit pd.read_csv(csv_path,header=0)
102 ms ± 7.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.read_pickle(pkl_path_before)
32.4 ms ± 5.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

类型转换后保存为Pickle文件

刚才看到object类型很占内存,可以将其转换为category类型。

data_csv.intent.astype('category').head()
0    Suicide
1    Suicide
2    Suicide
3    Suicide
4    Suicide
Name: intent, dtype: category
Categories (4, object): [Accidental, Homicide, Suicide, Undetermined]

先准换intent列,对比object的6495168,category的大小为object的1/65.

data_csv.intent.astype('category').memory_usage(deep=True)
101303

将所有数据转换成category类型

for col in data_csv.columns:
    data_csv[col] = data_csv[col].astype('category')

查看转换后占用内存大小,相比转换前的303688107,转换后的内存大小减小57倍。

data_csv.memory_usage(deep=True).sum()
1018587

将转换后的数据保存为pickle文件,并查看pickle本地文件大小。相比转换前的4824404,转换后的文件的大小减小4倍。

data_csv.to_pickle('gun_deaths_in_america_after_transform.pkl')
pkl_path_after = 'gun_deaths_in_america_after_transform.pkl'
os.stat(pkl_path_after).st_size
1012643

对比文件读取速度,比转换前快42倍。

%timeit pd.read_pickle(pkl_path_after)
2.57 ms ± 262 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit pd.read_csv(csv_path,header=0)
106 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

综合对比

files = [csv_path,pkl_path_before,pkl_path_after]

对比本地文件大小

转换后的文件占用磁盘空间最小,比原文件小4倍,对于保存大量数据非常有用。

for file in files:
    print('File size of the {0} is {1}:  '.format(file,os.stat(file).st_size))
File size of the gun_deaths_in_america.csv is 4824404:  
File size of the gun_deaths_in_america_before_transform.pkl is 5656925:  
File size of the gun_deaths_in_america_after_transform.pkl is 1012643:  

对比文件读取速度

转换后的读取速度比普通csv文件的读取速度快42倍。

%timeit pd.read_csv(csv_path,header=0)
97.5 ms ± 3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.read_pickle(pkl_path_before)
28.5 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.read_pickle(pkl_path_after)
2.18 ms ± 141 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

对比占用内存大小

转换后占用内存比转换前小30倍。

for file in files:
    if os.path.splitext(file)[1]=='.csv':
        print('memory_usage of the {0} is : {1}'. \
            format(file,pd.read_csv(file,header=0).memory_usage(deep=True).sum()))
    else:
        print('memory_usage of the {0} is : {1}'. \
            format(file,pd.read_pickle(file).memory_usage(deep=True).sum()))
memory_usage of the gun_deaths_in_america.csv is : 30368107
memory_usage of the gun_deaths_in_america_before_transform.pkl is : 30368107
memory_usage of the gun_deaths_in_america_after_transform.pkl is : 1010827

读取的数据都是一样的,就是数据类型不一样。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容