はじめに
ある程度大きく複雑なプログラムを定義する際には、たびたび関数ごとの動作速度を分析し、実行速度の改善に臨む必要が出てきます。こんな時、Python でどうやって実行速度を調べると良いのか迷う人も多いかと思います。僕自身も time モジュールを使って知りたい部分の実行時間を合計して print していました。しかし、Python には標準で実行時間計測モジュールが入っているとのことで、少しだけカスタムして簡単に見る方法を作ってみました。
環境
MacOS
Python 3.12
Jupyter Notebook
実装例
import cProfile
import pstats
import time
def fastHelloWorld():
time.sleep(0.1)
print("Fast: Hello, World!")
def slowHelloWorld():
time.sleep(1)
print("Slow: Hello, World!")
if __name__ == "__main__":
# 計測の実施
with cProfile.Profile() as pr:
# 関数の実行
fastHelloWorld()
slowHelloWorld()
# プロファイルの分析と結果のソート
stats = pstats.Stats(pr).sort_stats('cumtime')
# ファイル内で定義した関数のみフィルターし出力
stats.print_stats('/var/folders', 1.)
# 参考:フィルターなしの出力はこちら
# stats.print_stats()
結果
ファイル内で定義した関数のみの実行時間が簡単に出ました。
fastHelloWorld に関しては time.sleep で1秒間処理を止めているんですが、なぜ実行時間が0.8秒とかになっているんでしょう、ちょっとわかりませんでした……
また、Windows に関しては未検証のため、一旦フィルターなしで出力してみて、良い感じのフィルター方法を探してみてください。もしあればコメントいただけると助かります。(気が向いたら検証しておきます)
参考