3

Python で timeit.timeit() 関数のティアダウンを指定する方法はありますか? 「Statement」と「Setup」に引数があることは知っていますが、ティアダウンを実行する良い方法が見つかりませんでした。

「ステートメント」に分解コードを含めると、時間を計ろうとしているコード スニペットのタイミングがずれます。timeit モジュールの繰り返し機能を使用できるように、ハードウェア リソースを解放するためにティアダウンが必要です。

4

1 に答える 1

1

いいえ、これを行うには本当に良い方法はありません。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_funcmy をコピーするだけです。これをできる限りきれいに行いたい場合は、 を使用してパッチの適用/パッチの適用を解除することをお勧めします (ただし、問題なく自分で行うこともできます)。_funcmock

ここで内部的なものをいじったことに注意してください-この回答は警告なしにいつでも壊れる可能性があり、これは文書化されていないため、CPythonでのみ機能する可能性があります。

于 2014-03-25T15:49:28.313 に答える