dropna は時間がかかる

はじめに

rust のお勉強をしているときに見つけたスライドに、python についての気になるコードがありました。

メモリが上手く使えていないことを説明するコードなので、すこし変なことをやっています。
「dropna に時間がかかるんだろうな」と思ったので、この考えがあっているのか確認します。

実験

dropna が遅いのだろうという考えが正しいのか確かめるためにコードを書きました。

DataFrame を用意し、ランダムに nanに置換した後に

  1. dropna => average
  2. average

の2つで実行時間を比較します。
nan に置換する割合は freq_replace で指定します。

また、最後に

  • dropna()のみの時間の確認
  • DataFrame のid の確認

を行います。 

idの確認については、dropnaは新しいDataFrameを作ると認識していたのですが、確かめたことがなかったので行いました。

上のコードを回して確認してみると

例えば freq_replace=0.3 では手元環境で dropna() を行う方は4.78 倍の時間がかかる。
freq_replace=0.8 では5.3倍の時間がかかる。

最後にdropna()のみの時間を出力してみて、実際にdropna()に時間がかかっているのかを確認すると、
df.mean() が 0.021 秒、スライドの方法が0.112秒、dropna()が0.108 秒なのでほとんどの時間がdropna()に費やされていることが確認できる。

やはりdropna()に時間がかかっている予想はあっているようです。
dropna()は空欄を落とすというより、空欄を排除した新しいDataFrame を作ると言った方がよいはずなので時間がかかるのだろうと考えています。 dropna()を行うとid が変わっているのでこちらもあっているでしょう。

疑問

新しくメモリ領域を確保してDataFrameを作るならば、もとのDataFrameに空欄が多い方が早いのではないかと思ったのですが、そのような挙動は確認できませんでした。
なぜだかは分かりません。 データ量の問題なのでしょうか?

コメント

タイトルとURLをコピーしました