web-dev-qa-db-ja.com

pythonプログラムのCPU時間のタイミング?

コードのスニペットの時間を計りたいのですが、CPUの実行時間だけが欲しいのです(オペレーティングシステムのプロセスなどは無視します)。

Time.clock()を試しましたが、不正確すぎるようで、毎回異なる答えが返されます。 (理論的には、同じコードスニペットに対して再度実行すると、同じ値が返されるはずですか??)

私はtimeitで約1時間遊んだ。基本的に私にとってそれを殺すのは「セットアップ」プロセスです。実際にはコードをセットアップセクションに書き直して使用するだけなので、約20の関数をインポートする必要があります。

Cprofilesはますます魅力的に見えていますが、CPU時間を返しますか?また、マイナーな点-それはあまりにも多くの情報を出力します。出力された情報をtxtまたは.datファイルに取得して、実際に読み取る方法はありますか?

乾杯

OS:Ubuntuプログラム:python 2.7

11
Nathan Bush

プロセス全体の実行時間を計る方法を探しているようですが、最善の方法は timeit.default_timer() を使用することです。これは、現在のプラットフォームで利用可能な最も正確なtime.clock()またはtime.time()関数を提供しますが、これはシステム全体の時間であり、他のプロセスが干渉する可能性があることを意味しますあなたの測定。

Timeit.default_timer()のドキュメントからの情報は次のとおりです。

プラットフォーム固有の方法で、デフォルトのタイマーを定義します。 Windowsでは、time.clock()の粒度はマイクロ秒ですが、time.time()の粒度は1/60秒です。 Unixでは、time.clock()の粒度は1/100秒であり、time.time()の方がはるかに正確です。どちらのプラットフォームでも、default_timer()は、CPU時間ではなく実時間です。これは、同じコンピューターで実行されている他のプロセスがタイミングを妨げる可能性があることを意味します。

さまざまなタイミングAPIにアクセスできる可能性のあるcモジュールをテストしてみてください。


これを行うための最良の方法は、 time.process_time() を使用することです。これはpython 3.3以降でのみ使用可能です。これがドキュメントからの情報です。 :

システムの合計と現在のプロセスのユーザーCPU時間の値(秒単位)を返します。睡眠中の経過時間は含まれていません。定義上、プロセス全体です。戻り値の基準点は未定義であるため、連続した呼び出しの結果の差のみが有効です。

12
Shedokan

time.clock()の代わりに、 timeit.default_timer() ;を使用します。プラットフォームに最も正確なオプションを使用します。たとえば、Ubuntuの場合、代わりにtime.time()を使用します。

timeitを使用する場合は、timeitに再利用できるセットアップ関数を1つ作成します。はい、これは少し作業のように見えますが、タイムクリティカルな測定セクションにセットアップコードを含めずに、本当に測定したい時間を確実に計測できます。

3
Martijn Pieters