標籤:精度 img 設定 nta 依賴 contain win 系統 傳遞
在電腦領域有多種時間。第一種稱作CPU時間或執行時間,用於測量在執行一個程式時CPU所花費的時間。第二種稱作掛鐘時間,測量執行一個程式時的總時間。掛鐘時間也被稱作流逝時間或已耗用時間。與CPU時間相比,掛鐘時間通常長些,因為CPU執行測量的程式可能同時還在執行其它程式的指令。
另一個重要概念是所謂的系統時間,由系統時鐘測量。系統時間表示電腦系統時間傳遞的概念。要記住系統時鐘是可以由作業系統修改的,就是修改系統時間。
Python的time模組提供了各種與時間相關的函數。由於大部分函數調用同名的與平台相關的C庫函數,這些函數都是依賴於平台的。
time.time與time.clock
用於時間測量的兩個函數是time.time和time.clock。time以秒返回自新紀元以來的時間。對於任何作業系統都可以運行time.gmtime(0)尋找此系統的新紀元。對於Unix,新紀元是1970年1月1日。對於Windows,新紀元是1601年1月1日。time.time通常用於檢測Windows上的程式。在Unix系統上,time.time的作用與Windows相同,但time.clock的意義不同。在Unix系統上,time.clock以秒為單位返回當前處理器時間,例如,執行當前線程所花費的CPU時間。而在Windows上,它是以秒為單位的返回自首次調用該函數以來所流逝的系統時間。
time.time與time.clock另一個不同之處是,如果在兩次調用之間將系統時鐘調回,則time.time可能會返回一個較小的值,而time.clock則返回的值未增長。
下面是在Unix系統上運行time.time和time.clock的例子:
time.time()顯示系統時間過去大概1秒,而time.clock()顯示花費在當前進程上的CPU時間沁於1毫秒。同時可以看到time.clock()的精度高於time.time()
下面是在Windows下,同樣的程式返回不一樣的結果:
time.time()和time.clock()顯示系統時間大致過去了1秒釧。與Unix不同,time.clock()不返回CPU時間,返回的是系統時間,且精度較高。
time.time()和time.clock()對於不同的系統有不同行為,那麼在測配量序準確效能時應該使用哪一個呢?
這要視情況而定。如果程式啟動並執行系統能夠提供足夠的資源給程式,例如,一個運行基於Python的web應用程式的web伺服器,則使用time.clock()來測配量序會更有意義,因這個web應用程式可能是伺服器上的主要程式。如果程式啟動並執行系統上還同時運行著其它大配量序,則使用time.time()進行測量會更有意義。如果不是這樣,就應該使用基於掛鐘的計時器來測配量序的效能,因為這樣通常能反應程式的環境。
timeit模組
處理不同平台上time.time()和time.clock()的不同行為通常容易出錯,Python的timeit模組提供了一種處理時間的簡單方式。除了從代碼中直接調用,還可以從命令列調用它。
例如:
在基於Unix作業系統上
#在Windows上
在IDLE中
timeit使用了什麼計時?從timeit原始碼可以看到,它使用了最好的計時器:
timeit另一個重要機制是在執行期間,它禁用了記憶體回收,如下所示:
如果啟用記憶體回收,測配量序效能會更精確,例如,當程式為大量對象分配資源和釋放資源時,就應該在其設定期間啟用它:
除了非常特殊的情況,一般應使用模組timeit。此外還有一點要記住,測量一個程式的效能要考慮全面一些,因為在執行一個程式的時候不可能為它無限制地分配資源,在眾多迴圈中測量平均時間要好於在一次執行中測量一個時間。
Python測量時間,用time.time還是time.clock