pandas vs polars vs cudf 速度比較

環境

CPU : Ryzen 7 3700X
GPU : RTX3090
OS : Windows11 / WLS2(Ubuntu 20.04)
(GPUとCPUのスペック差ありすぎだろというのは承知してますが、許してください。)

ライブラリ

pandas : 1.3.5
polars : 0.15.16
cudf : 21.10.01

定義

カテゴリ_カラム数:groupbyやmergeで使うkeyの数(※行数が増えるとカテゴリの数は増えます。)
集計先_カラム数:上記のカラム以外のカラムの数。groupbyなどで平均値などが算出されるカラム

比較

groupby

行数の変化
コード例

df.groupby(['Category']).mean()

カテゴリ_カラム数:1固定
集計先_カラム数:1固定

行数 pandas polars cudf
10000 0.002895 0.003179 0.005933
100000 0.012538 0.018462 0.006192
1000000 0.040214 0.075114 0.008816
10000000 0.260392 0.196927 0.176728
100000000 2.463650 1.327975 0.439283

集計先_カラム数の変化
コード例

df.groupby(['Category']).mean()

行数:10000000固定
カテゴリ_カラム数:1固定

集計先_カラム数 pandas polars cudf
1 0.227775 0.224480 0.031103
3 0.375450 0.459507 0.276226
5 0.675405 0.719819 0.258477
10 1.743981 0.303561 0.243129
15 2.435381 0.445725 0.269769
20 2.997430 0.609127 0.406935
30 4.019127 0.829848 0.431432
40 4.816778 1.073103 0.566872
50 5.497594 1.385903 0.712177
100 10.140957 2.753827 1.376491


カテゴリ_カラム数の変化
コード例

df.groupby(['Category_1','Category_2','Category_3',....]).mean()

行数:10000000固定
集計先_カラム数:5固定

カテゴリ_カラム数 pandas polars cudf
1 0.615917 0.709272 0.080656
3 6.353710 1.244360 0.162426
5 12.523329 1.302869 0.180611
10 23.849953 1.410841 0.211472
15 32.821716 1.651729 0.248150
20 44.934443 1.874358 0.281277
30 63.756392 2.442004 0.345713
40 4.620836 2.987966 0.413109
50 102.124335 3.300031 1.089583
100 202.512414 5.987283 0.823975


merge

行数の変化
コード例

df1.merge(df2,how='left',on=['Category'])

カテゴリ_カラム数:1固定
集計先_カラム数:1固定

行数 pandas polars cudf
10000 0.003870 0.014977 0.004031
100000 0.019835 0.007815 0.005661
1000000 0.831185 0.167473 0.222576
5000000 17.477180 7.839335 1.170907
10000000 67.696730 32.517109 Out of Memory

カテゴリ_カラム数の変化
コード例

df1.merge(df2,how='left',on=['Category_1','Category_2','Category_3',....])

行数:100000固定
集計先_カラム数:5固定

カテゴリ_カラム数 pandas polars cudf
1 0.029654 0.029583 0.013971
3 0.036057 0.009770 0.007494
5 0.052946 0.009572 0.008975
10 0.108638 0.009084 0.026948
15 0.148352 0.009819 0.034198
20 0.204366 0.010366 0.019411
30 0.301510 0.010791 0.049016
40 0.401895 0.011617 0.065830
50 0.497233 0.011856 0.060512
100 1.006292 0.015121 0.155082


cudfよりpolarsのほうが早いという面白結果になりました。

結論

GPUメモリでは足りない場合:polars
GPUメモリで足りる場合:cudf
その他 EDA用?:pandas

何でもかんでもpandasを使うのはやめよう。