Pandas常見的性能優化方法
- 2019 年 10 月 4 日
- 筆記
Pandas
是數據科學和數據競賽中常見的庫,我們使用Pandas
可以進行快速讀取數據、分析數據、構造特徵。但Pandas
在使用上有一些技巧和需要注意的地方,如果你沒有合適的使用,那麼Pandas
可能運行速度非常慢。本文將整理一些Pandas
使用技巧,主要是用來節約記憶體和提高程式碼速度。
1 數據讀取與存取
在Pandas
中內置了眾多的數據讀取函數,可以讀取眾多的數據格式,最常見的就是read_csv
函數從csv文件讀取數據了。但read_csv
在讀取大文件時並不快,所以建議你使用read_csv
讀取一次原始文件,將dataframe
存儲為HDF或者feather格式。一般情況下HDF的讀取比讀取csv文件快幾十倍,但HDF文件在大小上會稍微大一些。
建議1:儘可能的避免讀取原始csv,使用hdf、feather或h5py格式文件加快文件讀取;
在某些定長的字元數據的讀取情況下,read_csv
讀取速度比codecs.readlines
慢很多倍。同時如果你想要表格盡量佔用較小的記憶體,可以在read_csv
時就設置好每類的類型。
2 itertuples與iterrows
itertuples
和iterrows
都能實現按行進行迭代的操作,但在任何情況下itertuples
都比iterrows
快很多倍。

建議2:如果必須要要用iterrows,可以用itertuples來進行替換。
3 apply、transform和agg時盡量使用內置函數
在很多情況下會遇到groupby
之後做一些統計值計算,而如果用內置函數的寫法會快很多。

transform() 方法+自定義函數,用時1分57s

transform() 方法+內置方法,用時712ms

agg() 方法+自定義函數,用時1分2s

agg() 方法+內置方法,用時694ms
建議3:在grouby、agg和transform時盡量使用內置函數計算。
這一部分的統計數據來自: https://www.cnblogs.com/wkang/p/9794678.html
4 第三方庫並行庫
由於Pandas
的一些操作都是單核的,往往浪費其他核的計算時間,因此有一些第三方庫對此進行了改進:
- modin:對讀取和常見的操作進行並行;
- swifter:對
apply
函數進行並行操作;
當然我之前也對此類庫進行了嘗試,在一些情況下會快一些,但還是不太穩定。在阿里雲安全賽中我是用joblib
庫寫的並行特徵提取,比單核特徵提取快60倍。
建議4:如果能並行就並行,用第三方庫或者自己手寫多核計算。
5 程式碼優化思路
在優化Pandas
時可以參考如下操作的時間對比:

建議5:在優化的過程中可以按照自己需求進行優化程式碼,寫程式碼盡量避免循環,盡量寫能夠向量化計算的程式碼,盡量寫多核計算的程式碼。
Pandas
官方也寫了一篇性能優化的文章,非常值得閱讀:
https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html