Pythonでif文を使って処理を分岐させるときに、追加で条件を指定して分岐させるelifと条件以外全てを処理するelseがあります。
基本的にはifとelifで必要な条件分岐を定義した上で例外は全てelseに流しますが、コードによってはelseが必要ないかもしれません。(多分そんなことは無い)
例えば、「a == 1」と「a == 0」の2パターンの分岐しか存在せず「a」に「1」と「0」以外の数値が入りようが無いコードの場合、片方はちゃんとelifで定義してもいいしelseで処理してしまっても一応問題なく動くわけです。
でももし実行速度に違いが存在するなら速い方を使いたいですよね。ということで念のためにelifとelseで処理速度にどれくらい差が発生するのかを検証してみました。
検証方法はfor文内に「elif」と「else」それぞれに分岐するif文コードを記述したうえで、1000万回ループする処理を1万回実行して処理時間の最大値・最小値・平均値・中央値を計測しました。
条件式には一番単純な方法として「1」と「0」の論理値のみを使って分岐させ、何も処理をせずにcontinueでループをするコードになっています。
# パターン:elif
if 0:
pass
elif 1:
continue
# パターン:else
if 0:
pass
else:
continue
また、全ての計測時間をヒストグラムにすることで視覚的にデータを見れるようにしています。
検証結果
elif | else | |
最大値 | 1.18392649991438 | 1.04271889990196 |
最小値 | 0.48784640012309 | 0.526802500011399 |
平均値 | 0.632408360261424 | 0.59211800813782 |
中央値 | 0.625505699892528 | 0.585418949951418 |
「elif」は今回の検証の場合、論理値による判定が入るのでその分遅くなることは間違いないはずです。
問題はどれくらい遅くなるのかだった訳ですが、ヒストグラムを見るとしっかり違いが現れていますね。
結果としては「else」と比べて「elif」は平均値・中央値ともに約1.068倍遅くなるというデータになりました。微妙な差かもしれませんが、for文などで大量に処理を繰り返し実行すると影響が大きくなる場合があるかも。しかも今回のように単純な論理値1つではなく判定条件が複雑なものになればさらに遅くなる可能性が高いです。
本来if文のコードを書くときにはちゃんと「elif」で条件定義をし「else」で例外処理をした方がいいので全面的に使える方法ではありませんが、ピンポイントで使えそうな場面があれば積極的に使って処理速度改善を図るのもアリな結果だと思いました。
コメント