2014-09-10 35 views
1

即使它們已被棄用且存在比time(即timeit)更好的模塊,我想知道兩個函數time.clock()time.time()之間的差異。瞭解time.clock()和time.time()

從後者開始(time.time()),它基本上以秒爲單位返回從1970年1月1日(如果我沒有錯的話)流逝的時間,精度通常爲1秒。 '直到這裏很容易。

相反,time.clock()還是讓我感到困惑。 來自文檔:

在Unix上,返回當前處理器時間作爲以秒爲單位的浮點數。精確性,實際上「處理器時間」含義的定義取決於具有相同名稱的C函數的精確性,但無論如何,這是用於基準測試Python或時序算法的函數。

在Windows中,此函數返回自第一次調用該函數經過掛鐘秒,作爲一個浮點數,基於Win32函數QueryPerformanceCounter的()。分辨率通常優於1微秒。

現在在Windows中很清楚,它的確如time.time()所做的那樣,只是精度更高。

但在Unix/Linux下我無法理解。我嘗試下面的代碼:

import time 

def procedure(): 
    time.sleep(2.5) 

# measure process time 
t0 = time.clock() 
procedure() 
print(time.clock() - t0, "process time") 

和我5.300000000000096e-05 seconds process time這是非常奇怪的我。

閱讀this已經張貼問題的答案說:

[...] time.clock()測量的已使用當前進程的CPU時間。

但我無法得到它,當前進程使用的時間在做什麼?當我在Unix上撥打time.clock()時,我得到一個浮點數,這意味着在那個瞬間?從過程中消耗的時間多少?至 ??

+0

「棄用」表示它們將在未來的版本中被刪除,這與推薦不以特定方式使用時不同。 – chepner 2014-09-10 19:57:23

+0

嘗試在需要幾秒鐘計算的函數中放入一個'print(time.clock())',那麼它會更有意義。 – 2014-09-10 20:00:20

回答

3

在多處理系統(如Linux或Windows),幾個獨立的過程依次在每個運行。當一個進程正在運行時,所有其他進程都在等待*。有時候,跑步過程會放棄(有時會合作,有時會被迫停止跑步)。其他一些流程然後輪到運行。

此過程中開關可能發生數十,數百甚至數千次每秒。從用戶的角度來看,所有進程似乎都在同時運行。但事實上,他們都在輪流運行。

當一個進程調用time.sleep(2.5)時,它宣佈它放棄了當前回合的剩餘部分,並且對於未來至少2.5秒內的任何回合都不感興趣。所以,接下來的2。5秒鐘,它消耗沒有處理器時間。

反之,如果這是在系統中唯一的過程:

while True: 
    i += 1 

它絕不會放棄它的轉向;它會使用100%的處理器。

那麼,這與time.clock()有什麼關係?在Linux中,time.clock()返回您的進程自首次啓動以來所進行的所有轉場的持續時間之和。這是衡量您的流程工作有多難的一個公平標準。如果您只測量掛鐘時間(即time.time()),那麼您的任務持續時間將取決於正在運行的其他進程數量以及他們正在執行的操作。


*這說明適用於單個處理器多處理系統。對於多處理器系統(或多核系統),許多進程實際上可以同時運行。無論如何,time.clock()都會返回所有轉彎的持續時間總和。

+0

你不能更清楚:) 在Windows中不是'time.clock()'的等價物嗎?我的意思是,它的工作原理與unix系統一樣。 – zer0uno 2014-09-10 20:13:05

+0

謝謝。我不知道是否有一個Python標準庫調用返回Windows上的CPU時間。根據[這個問題](http://stackoverflow.com/questions/17432502/how-can-i-measure-cpu-time-and-wall-clock-time-on-both-linux-windows),相當於Win32 API調用是[GetProcessTimes](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683223(v = vs.85).aspx)。 – 2014-09-10 20:16:09

+2

順便說一句,我暗示進程的'clock()'值從'0'開始並且增加。至少在Linux中,我相信這是真的。適當的標準(POSIX)表示,它從一些任意值開始並增加。因此,測量CPU消耗時間的安全方法是獲取'clock()'的開始值和結束值之間的差值。 – 2014-09-10 20:19:37

-1

time.time()返回比可以被解釋爲當前日期和時間的值。 time.clock()返回當前進程已使用多少CPU時間的度量。

相關問題