環境
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のほうが早いという面白結果になりました。