Python で timeit.timeit() 関数のティアダウンを指定する方法はありますか? 「Statement」と「Setup」に引数があることは知っていますが、ティアダウンを実行する良い方法が見つかりませんでした。
「ステートメント」に分解コードを含めると、時間を計ろうとしているコード スニペットのタイミングがずれます。timeit モジュールの繰り返し機能を使用できるように、ハードウェア リソースを解放するためにティアダウンが必要です。
いいえ、これを行うには本当に良い方法はありません。sourceを見ると、Timer クラスをサブクラス化し、それらself.inner
を新しいバージョンに置き換える必要があるでしょう。
例えば:
import inspect
import timeit
class MyTimer(timeit.Timer):
def __init__(self, stmt="pass", setup="pass", teardown=None, timer=timeit.default_timer):
timeit.Timer.__init__(self, stmt, setup, timer)
# Pull the actual function to time off the original `self.inner` function.
time_func = inspect.getargspec(self.inner).defaults[0]
# It gets added as a keyword so that lookup in the
# current namespace is really fast.
def _func(_it, _timer, _func=time_func):
setup()
total = 0.0
for _i in _it:
_t0 = _timer()
_func()
_t1 = timer()
total += _t1 - _t0
if teardown:
teardown()
return total
self.inner = _func
ただし、一度に 1 つのテストのタイミングに制限されているため、この方法ではタイミングがうまくいかないことに注意してください。残念ながら、私は一度に複数のテストの時間を計る方法を理解するのに十分なほど賢くはありません。
または、にモンキー パッチを適用することもできます。基本的には、タイマーを作成する前に、上から_template_func
my をコピーするだけです。これをできる限りきれいに行いたい場合は、 を使用してパッチの適用/パッチの適用を解除することをお勧めします (ただし、問題なく自分で行うこともできます)。_func
mock
ここで内部的なものをいじったことに注意してください-この回答は警告なしにいつでも壊れる可能性があり、これは文書化されていないため、CPythonでのみ機能する可能性があります。