2014-03-25 29 views
1

我必須在我的類中的一個時間執行算法,並且我使用time.time()函數來執行此操作。在實現它之後,我必須在包含較小和較大數據集的大量數據文件上運行該算法,以正式分析其複雜性。使用time.time()來定時函數經常返回0秒

不幸的是,在小數據集上,即使我在查看大數據集的運行時時使用該函數得到0.000000000000000001的精度,我也會得到0秒的運行時間,我無法相信它實際上需要的時間少於在較小的數據集上。

我的問題是:是否有使用此功能的問題(如果有,是否有另一個我可以使用的功能有更好的精度)?或者我做錯了什麼?

這裏是我的代碼,如果你永遠需要它:

import sys, time 
import random 

from utility import parseSystemArguments, printResults 

... 

def main(ville): 
    start = time.time() 

    solution = dynamique(ville) # Algorithm implementation 

    end = time.time() 

    return (end - start, solution) 

if __name__ == "__main__": 
    sys.argv.insert(1, "-a") 
    sys.argv.insert(2, "3") 

    (algoNumber, ville, printList) = parseSystemArguments() 

    (algoTime, solution) = main(ville) 

    printResults(algoTime, solution, printList) 

的printResults功能:

def printResults(time, solution, printList=True): 
    print ("Temps d'execution = " + str(time) + "s") 
    if printList: 
     print (solution) 
+1

http://docs.python.org/2/library/timeit.html允許您多次執行片段。 – DTing

+0

我能用我的函數實現timeit()的算法得到返回值嗎?我無法在文檔中看到包含該方面的示例。 – Choub890

回答

2

我的問題的解決方案是使用timeit模塊,而不是時間模塊。

import timeit 

... 

def main(ville): 
    start = timeit.default_timer() 

    solution = dynamique(ville) 

    end = timeit.default_timer() 

    return (end - start, solution) 
3

不要用一個浮點數的分辨率混淆的系統時間分辨率。計算機上的時間分辨率與系統時鐘更新一樣頻繁。更新系統時鐘的頻率因機器而異,因此爲了確保您能看到與時間的差異,您需要確保它執行一毫秒或更長時間。嘗試把它變成一個循環是這樣的:

start = time.time() 

k = 100000 
for i in range(k) 
    solution = dynamique(ville) 

end = time.time() 

return ((end - start)/k, solution) 

在最後的帳簿,然後需要通過循環迭代的數量來劃分知道多久你的代碼實際上是通過運行一次。您可能需要增加k才能很好地衡量執行時間,或者如果您的計算機長時間在環路中運行,您可能需要減少它。

+0

這可以工作,但運行需要很長時間,因爲您必須多次運行算法。在較小的數據集上,這很好,可以刪除0秒的執行,但是對於每個需要45秒的較大數據集,多次運行算法耗時過長。按照我對這個問題的回答,我使用timeit模塊來解決我的問題。感謝您的幫助! – Choub890