44

プログラムの特定の部分にかかる時間を測定する必要があります(デバッグ用ではなく、出力の機能として)。合計時間は数分の1秒になるため、精度は重要です。

timeitに出くわしたとき、 timeモジュールを使用するつもりでした。これは、実行時間を測定するための多くの一般的なトラップを回避すると主張しています。残念ながら、それはひどいインターフェースを持っており、文字列を入力として受け取り、それを評価します。

それで、時間を正確に測定するためにこのモジュールを使用する必要がありますか、それとも時間で十分ですか?そして、それが指す落とし穴は何ですか?

ありがとう

4

7 に答える 7

34

Python のドキュメントによると、さまざまなオペレーティング システムでの時間関数の精度に関係しています。

デフォルトのタイマー機能はプラットフォームに依存します。Windows では、time.clock() の粒度はマイクロ秒ですが、time.time() の粒度は 1/60 秒です。Unix では、time.clock() は 1/100 秒の粒度を持ち、time.time() ははるかに正確です。どちらのプラットフォームでも、デフォルトのタイマー関数は、CPU 時間ではなくウォール クロック時間を測定します。これは、同じコンピューターで実行されている他のプロセスがタイミングに干渉する可能性があることを意味します... Unix では、time.clock() を使用して CPU 時間を測定できます。

timeit.pyのコードから直接プルするには:

if sys.platform == "win32":
    # On Windows, the best timer is time.clock()
    default_timer = time.clock
else:
    # On most other platforms the best timer is time.time()
    default_timer = time.time

さらに、ランタイム コードの設定を直接処理します。使用するtime場合は、自分で行う必要があります。もちろん、これはあなたの時間を節約します

Timeit のセットアップ:

def inner(_it, _timer):
    #Your setup code
    %(setup)s
    _t0 = _timer()
    for _i in _it:
        #The code you want to time
        %(stmt)s
    _t1 = _timer()
    return _t1 - _t0

パイソン 3:

Python 3.3 以降、time.perf_counter()(システム全体のタイミング) またはtime.process_time()(プロセス全体のタイミング) を使用できますtime.clock()

from time import process_time

t = process_time()
#do some stuff
elapsed_time = process_time() - t

新しい関数process_timeには、スリープ中に経過した時間が含まれません。

Python 3.7+:

Python 3.7 以降では、 process_time_ns()which に似てprocess_time()いますが時間をナノ秒で返すものも使用できます。

于 2009-11-06T03:36:26.540 に答える
29

タイミング コンテキスト ( PEP 343を参照) を構築して、コード ブロックを非常に簡単に測定できます。

from __future__ import with_statement
import time

class Timer(object):
    def __enter__(self):
        self.__start = time.time()

    def __exit__(self, type, value, traceback):
        # Error handling here
        self.__finish = time.time()

    def duration_in_seconds(self):
        return self.__finish - self.__start

timer = Timer()

with timer:
    # Whatever you want to measure goes here
    time.sleep(2)

print timer.duration_in_seconds()    
于 2009-11-06T04:05:56.197 に答える
8

timeit モジュールは、アプリケーションの単純な監視としてではなく、アルゴリズムのパフォーマンス テストを行うために設計されているように見えます。おそらく最善の方法は、時間モジュールを使用し、time.time()関心のあるセグメントの最初と最後で呼び出し、2 つの数値を減算することです。取得した数値は、システム タイマーの実際の分解能よりも多くの小数点以下の桁数になる場合があることに注意してください。

于 2009-11-06T03:31:59.137 に答える
4

プロファイルまたはcProfileで提供される機能を確認しましたか?

http://docs.python.org/library/profile.html

これにより、関数呼び出しの前後の時間を単に印刷するよりもはるかに詳細な情報が提供されます。多分一見の価値があります...

于 2009-11-06T03:50:22.330 に答える
3

ドキュメントには、プラットフォームによって time.clock() と time.time() の解像度が異なることも記載されています。Unix では、time.clock() はウォール クロック時間ではなく CPU 時間を測定します。

timeit は、テストの実行時にガベージ コレクションも無効にしますが、これはおそらく実稼働コードには望ましくありません。

ほとんどの目的には time.time() で十分です。

于 2009-11-06T03:37:25.083 に答える
2

Python 2.6以降、timeitは入力文字列に制限されなくなりました。ドキュメントの引用:

バージョン2.6で変更:stmtおよびsetupパラメーターは、引数なしで呼び出し可能なオブジェクトも取得できるようになりました。これにより、timeit()によって実行されるタイマー関数にそれらの呼び出しが埋め込まれます。この場合、余分な関数呼び出しがあるため、タイミングのオーバーヘッドが少し大きくなることに注意してください。

于 2013-02-08T17:43:53.077 に答える