1. ホーム
  2. python

[解決済み] time.perf_counter()とtime.process_time()を理解する。

2023-02-20 03:45:47

質問

新機能について質問があります time.perf_counter()time.process_time() .

前者については、ドキュメントから。

パフォーマンスカウンターの値(端数秒)を返す、つまり 利用可能な最高の解像度を持つクロック を使用して短い時間を測定します。これはスリープ中に経過した時間を含み、システム全体である。返される値の基準点は不定であり、連続した呼び出しの結果の差分のみが有効である。

この「最高解像度」は、すべてのシステムで同じですか? それとも、たとえば、linux や windows を使用する場合、常にわずかに依存するのでしょうか?

のドキュメントを読むと、この質問は time.time() のドキュメントを読むと、「すべてのシステムが1秒より良い精度で時間を提供するわけではない」と書かれているので、今より良い、より高い解像度を提供することができるのでしょうか?

後者について。 time.process_time() :

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

よくわからないんだけど、その「システム時間」と「ユーザCPU時間」って何?何が違うのでしょうか?

どのように解決するのですか?

時間には「絶対時間」と「相対時間」の2種類があります。

絶対時間とは「現実の時間」のことで、これは time.time() によって返され、私たちが扱うのに慣れている「現実の時間」です。これは通常、少なくとも 1 秒の分解能で過去の固定点 (たとえば、1970 年 1 月 1 日の 00:00:00 UTC の UNIX エポック) から測定されます。最近のシステムでは、通常ミリ秒またはマイクロ秒の解像度を提供する。RTC(リアルタイムクロック)回路は通常バッテリーで駆動するため、システムは電源投入の合間にも実時間を記録し続ける。この「現実の時間」は、場所(タイムゾーン)や季節(サマータイム)により変更されたり、UTCからのオフセット(GMTまたはズールー時間とも呼ばれる)として表現されることもあります。

次に、相対時間です。 time.perf_countertime.process_time . このタイプの時間は、現実の時間との関係がシステムや実装に依存するという意味で、定義されたものではありません。時間間隔、つまり2つのインスタントの間の経過時間に比例する単位のない値を測定するためにのみ使用することができます。これは主に相対的なパフォーマンスを評価するために使用されます (たとえば、このバージョンのコードがそのバージョンのコードよりも速く実行されるかどうか)。

最近のシステムでは、CPU のハードウェアクロックに関連する周波数で単調に増加する CPU カウンターを使用して測定されます。カウンターの分解能はシステムのハードウェアに大きく依存するため、その値を実世界の時間に確実に関連付けることはできませんし、ほとんどの場合、システム間で比較することさえできません。さらに、カウンターの値は、CPU の電源投入またはリセットが行われるたびにリセットされます。

time.perf_counter はカウンタの絶対値を返します。 time.process_time は CPU カウンターから派生した値ですが、特定のプロセスが CPU 上で実行されている場合にのみ更新され、プロセス自体が CPU 上で実行されている時間である「ユーザー タイム」と、プロセスの代わりにオペレーティング システム カーネルが CPU 上で実行されている時間である「システム タイム」に分割することが可能です。