2017-10-20 19 views
2

私はtime.time()関数のいくつかの動作でちょっと混乱しています。私がちょうど無知であるかどうか不思議です。連続した同じ行の関数呼び出しとアンパック

さてさて、私は、私は解凍して2つの機能を割り当てることができます知っているが、このように呼び出す:

>>> import time 
>>> beg, end = time.time(), time.time() 
>>> beg == end 
True 

この平等は、実行時と、理にかなって最初time.time()と第二time.time()は同じです彼らは同じ時点で評価されます。

>>> beg = time.time(); end = time.time() 
>>> beg == end 
True 

私は奇妙な見つけるこの平等:より多くの混乱何

はこれです。私はtime.time()は小数点第7位までしか丸めず、おそらくPythonはこれらのコマンドを両方とも0.0000001秒未満で実行するのに十分速いと考えています。私は、この等式は多分ちょうどPythonが1時間本当に速いされていたと思ったので、私はそれを倍の多くを試してみました:

for _ in range(10000): 
    beg = time.time(); end = time.time() 
    assert beg == end 

私にとって、これは何のAssertionErrorを発生させません。何が契約ですか、ここですか?私はそれを信用しているよりもPythonが速いですか?私の前提は、; - 独立したステートメントが連続して評価されるが、同時にではないということです(したがって、begendと等しくないと私の驚きです)。

編集:

ここでは私のために何time.time()戻っだ、私のマシンのスペックに伴い:

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> import time 
>>> time.time() 
1508532204.5873115 
>>> time.time() 
1508532250.9893117 
+0

私は毎回偽です。あなたは 'time.time()'から実際に何を得るのですか?あなたのシステム時間は何に設定されていますか? – user2357112

+0

また、「実行時に、最初のtime.time()と2番目のtime.time()は同じです - 同じ時点で評価されます」 - それはどのように動作するかではありません。 – user2357112

+0

@ user2357112それでは「それは機能しますか」?タプルアンパックの例では、それらも連続して評価されていますか? – blacksite

答えて

2

まず、リストを展開についての仮定は、単に間違っています。 time()関数が2回計算され、別々の結果が返されるため、は異なる値の時間を提供できます。

具体的には、Pythonは最初に2つの時刻値のタプルを作成します。(time.time(), time.time())。そして、そのタプルを変数beg, endに解凍します。

パラレル化や値のキャッシング、またはvar-by-varの割り当て(考慮:a,b = b,a値交換パターン:それは文字通りt = (b,a); (a,b) = tです)を持つ特別な魔法はありません。


第二に、タイムスタンプの比較は非常にあなたのシステム(主にOS)に依存します。 time.time()については

は、きめの細かい解像度はちょうど保証されません。

注意時間は常に浮動小数点 数として返されていても、いないすべてのシステムが1よりも優れた精度で時間を提供することを 秒。

UNIXシステム(MacOSXではありません)では、time.clock_getres(clk_id)を使用してクロック解像度を取得できます。

Windowsの場合は、time.clock()のマニュアルに記載されているQueryPerformanceCounter()へのWin32呼び出しの情報を見つけることができます(私はWindows APIについて十分な知識がありません)。

あなたのOSの時間精度については、あまりPython関連ではないので、この質問に答えるためにgoogleもしてください。

このような測定には解像度が不十分で、CPUが非常に高速です(現在は一般的です)、時間の測定値が近すぎて区別できません。もちろん、CPUタクトで測定された場合、それらは大きく異なります。しかし、利用可能な最小時間単位では違いはありません。

非常に遅いマシンでコードを実行しようとすると、またはCPUがいくつかの計算タスク(CPU使用率99-100%)で非常にオーバーロードされ、処理に多大な時間を費やすことができません。 CPUが1つのプロセスだけでビジーではなく、複数のプロセス間で非常に頻繁にコンテキストを切り替える方が良いでしょう。数百のCPU集約的なプロセスや、ちょうどアイドリングしているCPU(フォークボンベのようなもの)を1〜2千も持っているかもしれません。


UPD:質​​問の追加の詳細には:カンマの後の桁数は、1秒ではないことを除いて、あなたのマシンの時間分解能、については何も言いません。

OSは、1秒のフレーム内で何かを測定します。その結果は、クロックの解像度だけでなく、時間リクエストが行われた時刻によっても異なります。

浮動小数点数の問題はもちろんですが、端数を不適切に四捨五入して最も近い「フィッティング」フロートにすることができます。浮動小数点数の精度をカンマの前の部分の大きさに応じて比較します。

>>> 2/3 
0.6666666666666666 

>>> 2000000/3 
666666.6666666666 

>>> 200000000000/3 
66666666666.666664 # <== Surprise! ;-) 
関連する問題