2014-09-13 63 views
1

我對上述函數的結果的精確度感到非常困惑。
爲了我的文檔不清晰可言,比如這裏有兩句話:Python2/3中的time.clock()和time.time()分辨率

time模塊文檔

的各種實時功能的精確度可能低於建議表達其價值或論點的單位。 E.g.在大多數Unix系統中,時鐘「滴答」只有每秒50或100次。

timeit模塊文檔

定義缺省計時器,在一個特定平臺的方式。在Windows上,time.clock()的粒度爲微秒,但time.time()的粒度爲1/60秒。 在Unix上,time.clock()具有1/100秒的粒度,time.time()更準確。在任一平臺上,default_timer()都會測量掛鐘時間,而不是CPU時間。這意味着在同一臺計算機上運行的其他進程可能會影響計時。

現在因爲實時,在Unix中,它返回了time.time(),它的分辨率遠遠高於1/100,它怎麼能每秒鐘「嘀」50或100次呢?


總是關於分辨率,我不明白什麼精確的分辨率,我得到調用各項功能,所以我嘗試了以下,我把我的猜測在評論:

>>> time.clock() 
0.038955       # a resolution of microsecond? 
>>> time.time()      
1410633457.0955694     # a resolution of 10-7 second? 
>>> time.perf_counter() 
4548.103329075      # a resolution of 10-9 second (i.e nanosecond)? 

附:這是在Python3.4.0上嘗試的,在Python2中爲time.clock()time.time()我總是得到6個數字,所以1us精度?

回答

4

精度與有關,值多少次變化

如果您可以無限快地調用這些函數中的任何一個,那麼每個函數都會以不同的速率返回一個新值。

因爲每個都返回一個浮點值,它沒有絕對精度,所以你不能從它們的返回值中知道它們的精度。你需要測量這些值隨着時間的推移而變化,以確定它們的精確度。

要顯示的差異,運行:

import time 

def average_deltas(*t): 
    deltas = [t2 - t1 for t1, t2 in zip(t, t[1:])] 
    return sum(deltas)/len(deltas) 

for timer in time.clock, time.time, time.perf_counter: 
    average = average_deltas(*(timer() for _ in range(1000))) * 10 ** 6 
    print('{:<12} {:.10f}'.format(timer.__name__, average)) 

在我的Mac此打印:

clock  0.6716716717 
time   0.2892525704 
perf_counter 0.1550070010 

所以perf_counter對我的架構最大的精確度,因爲它每秒變化更加頻繁,使得值之間的增量變小。

可以使用time.get_clock_info() function查詢每個方法提供什麼精度:

>>> for timer in time.clock, time.time, time.perf_counter: 
...  name = timer.__name__ 
...  print('{:<12} {:.10f}'.format(name, time.get_clock_info(name).resolution)) 
... 
clock  0.0000010000 
time   0.0000010000 
perf_counter 0.0000000010 
+0

我不明白,這樣的文件是錯誤的?如果'time.pref_counter()'在點後面返回9個數字,意味着它已經達到了納秒級的分辨率,因爲如果不是這樣,爲什麼要返回9個數字而不是5或6? – zer0uno 2014-09-13 19:02:15

+1

@antox:不,它意味着你誤解了精確度*的含義。浮點僅僅是秒的一小部分,但浮點值幾乎總是不精確的(它是二進制分數的總和,1/2 + 1/4 + 1/8等,*近似*值)。 – 2014-09-13 19:05:04

+1

另外[**處理器時間**和**掛鐘時間之間的差異**](http://pymotw.com/2/time/#processor-clock-time)是相關的 - 基本上處理器時鐘是隻有在你的流程正在工作時纔會推進。所以每次它蜱時,它的值可能有一定的* precision *,但它的*精度*也取決於CPU負載。 – 2014-09-13 19:06:31