⏲️
[Python]with構文を利用したある範囲の処理時間を計測する方法
よくある方法
まずは処理時間を計測するよく見る方法は以下のような感じでしょうか
import time
start = time.time()
time.sleep(5) # 何らかの処理(関数)
end = time.time()
print(f"経過時間: {end - start:.2f} seconds")
この方法だと、計測したい箇所が出るたびに開始の時間start = time.time()
準備して
終了の時間を減算――って面倒ですよね。見栄えもあまりよくないはずです。
@contextmanager
を使う
しかし、これをもっとスッキリかけて汎用的に書ける方法があります!!!
それは@contextmanager
を使った方法です。
from contextlib import contextmanager
import time
@contextmanager
def timer(name: str):
t0 = time.time()
yield
print(f"{name}処理時間: {time.time() - t0:.2f} seconds")
このような関数timer()
を用意すれば、with構文を使うだけで簡単に時間を計測できます。
with timer("何らか"):
time.sleep(2)
# 何らか処理時間: 2.00 seconds
もちろんネストも可能
with timer("Outer"):
time.sleep(2) # 何らかの処理(関数)
with timer("Inner"):
time.sleep(2) # 何らかの処理(関数)
# Inner処理時間: 2.00 seconds
# Outer処理時間: 4.00 seconds
まとめ
こんな感じで独自のコンテキストマネージャを作成して、ある特定の範囲だけでの特別な処理をしたい時に@contextmanager
が有用ですね。時間計測以外にも色々考えられそうです。
Discussion