#出来るようになること
withを使用して時間計測ができるようになる。
Kaggleなどで時間を計測するときに使える。
#参考
メルカリコンペ1位のコードで使用されていました。
#使用方法
コンテキストマネージャとして使用したい関数の定義の直前に@contextmanagerと記載するだけ。
timerが呼ばれた時に初期時間がt0に格納されて、yeildで一時関数から抜ける。
time.sleep(1)の処理終了後に再びtimerに戻ってきて初期時間との差分を出力している。
from contextlib import contextmanager
import time
@contextmanager
def timer(name):
t0 = time.time()
print("start")
yield
print("end")
print(f'[{name}] done in {time.time() - t0:.0f} s')
with timer('process train'):
time.sleep(1)
@contextmanagerの記載がない場合はtimerはcontextmanagerとして動作できないためエラーになる。
#コンテキストマネージャー
[with分とコンテキストマネージャー]
(https://docs.python.org/ja/3/reference/datamodel.html#context-managers "Qiita")
コンテキストマネージャは、コードブロックを実行するために必要な入り口および出口の処理を扱う。
以下の例のように、コンテキストマネージャクラスには開始用の処理と終了時用の処理が記載されている。そのため、@contextmanagerでコンテキストマネージャーにすると、開始時と終了時にtimerが呼ばれることになる。@contextmanagerを記載しなかった場合は__enter__の定義がないためエラーとなった。
参考