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

itertuplesiterrows都能實現按行進行迭代的操作,但在任何情況下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