⏲️

[Python]with構文を利用したある範囲の処理時間を計測する方法

2023/01/20に公開

よくある方法

まずは処理時間を計測するよく見る方法は以下のような感じでしょうか

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