pandas の dropna は時間がかかる
はじめに
rust のお勉強をしているときに見つけたスライドに、python についての気になるコードがありました。
メモリが上手く使えていないことを説明するコードです。
遅いコードですが、おそらく恣意的に変なことをやっているためです。
「本来は不要な dropna に時間がかかるんだろう」と思ったので、この考えがあっているのか確認します。
実験
dropna が遅いという予想を確認するにコードを書きました。
DataFrame を用意し、ランダムに nan に置換した後に
- dropna => average
- average
の 2 つで実行時間を比較します。
nan に置換する割合は freq_replace で指定します。
また、最後に
- dropna()のみの時間の確認
- DataFrame の id の確認
を行います。
id の確認については、dropna は新しい DataFrame を作ることを確認する目的です。
コード手元の環境で実行すると、
- freq_replace=0.3: dropna() を行う方は average を取る方法に比べて 4.78 倍の時間がかかる。
- freq_replace=0.8: dropna() を行う方は average を取る方法に比べて 5.3 倍の時間がかかる。
最後に dropna()のみの時間を出力して、実際に dropna()に時間がかかるのか確認した結果が下です。
- df.mean() : 0.021 s
- dropna() : 0.108
やはり dropna()に時間がかかっている予想はあっているようです。
dropna()は空欄を落とすというより、空欄を排除した新しい DataFrame を作ると言った方がよいはずなので、時間がかかるのだろうと考えています。
dropna()を行うと id が変わっているのでこちらの考えも正しいでしょう。
疑問
新しくメモリ領域を確保して DataFrame を作るならば、もとの DataFrame に空欄が多い方が早いのではないかと考えたのですが、そのような挙動は確認できませんでした。
なぜだかは分かりません。 データ量の問題なのでしょうか?
2020 12 20