一、引言
在Python中,如果需要測量一段代碼的執行時間,通常可以使用time模塊,通過記錄開始和結束時間,計算兩個時間之差得到執行時間。但是,這種方法有以下缺點:一方面,time模塊僅僅能夠測量代碼的全局執行時間,無法知道代碼中每個語句執行所花費的時間;另一方面,在實際使用時,由於Python的解釋執行方式,相鄰代碼執行順序可能會產生微小的差異,導致測試結果不準確。對於這些問題,Python提供了Timeit模塊來進行精確的時間測量。下面我們將詳細介紹Timeit模塊的使用。
二、基本使用
Timeit模塊中最常用的函數是timeit()。它能夠自動重複運行一段代碼,並測量多次運行所花費的時間,並返回平均時間。timeit()函數需要傳入兩個參數:第一個參數是要測試的代碼所在的字元串;第二個參數是指定測試運行次數和測試的環境。下面是一個示例:
import timeit # 測試求和函數 def sum_func(): total = 0 for i in range(1000): total += i return total # 測試 t = timeit.timeit('sum_func()', setup='from __main__ import sum_func', number=1000) print(t)
上述代碼中,我們定義了一個求和函數sum_func(),使用timeit()函數進行多次測試,並輸出平均運行時間。其中,第一個參數傳入了待測試代碼的字元串形式;第二個參數指定了測試環境,通過from __main__ import語句,將sum_func()函數導入測試環境中。最後一個參數number指定了運行次數,這裡我們進行了1000次運行測試。執行該段代碼後,即可輸出測試平均用時。
三、高級使用
1、測試語句所花費的時間
在實際代碼測試過程中,往往需要知道每一個語句所花費的時間。Timeit模塊提供了repeat()函數,它會多次運行一段代碼,並返回每次運行的時間。可以通過這一函數獲取每個語句單獨的運行時間,也可以獲取多次運行結果的統計信息。
import timeit # 測試一句話代碼 t = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) print(t) # 測試多句話代碼 stmt = ''' total = 0 for i in range(1000): total += i ''' t = timeit.timeit(stmt, number=10000) print(t)
上面的例子中,我們使用timeit()函數測試了一句代碼和多句代碼的運行時間,並在測試完成後輸出了平均運行時間。
2、設置全局變數與局部變數
默認情況下,timeit()函數測試的代碼是在一個新的命名空間中執行的。如果有全局變數、類、函數等需要導入,需要在函數中傳遞一個global
語句或者在setup
參數中導入。
import timeit # 測試全局變數 x = list(range(2000000)) def test(): global x x.sort() print(timeit.timeit('test()', setup='from __main__ import test', number=1000)) # 測試局部變數 def test2(): x = list(range(2000000)) x.sort() print(timeit.timeit('test2()', setup='from __main__ import test2', number=1000))
測試完成後會輸出平均運行時間。在第一個示例中,由於x為全局變數,我們需要在函數中添加global
語句。而在第二個示例中,由於x只在函數內部使用,不需要在函數中添加任何特殊語句。
3、使用Timer對象
Timeit模塊中還提供了一個Timer類,它可以更方便地進行代碼測試。Timer類的常用方法是timeit()
,它與timeit()
函數的使用方式相同,接收相同的參數,但對於相同的測試代碼,Timer實例的timeit()
方法可能會得到更準確的計時值。
import timeit # 聲明計時器 t = timeit.Timer('"-".join(str(n) for n in range(100))') # 執行測試 print(t.timeit())
以上代碼中,我們聲明了一個計時器t,然後使用test()方法測試。timeit()
方法會返回執行測試所花費的時間。這裡我們只測試了一句話代碼,測試多句話代碼的方式與timeit()函數相同。
總結
Timeit模塊是一個非常實用的模塊,它能夠高度精確地測試代碼運行時間,並且支持多種測試方式。這些功能在一些對速度要求高的應用程序和測量程序性能的時候非常有用。
原創文章,作者:VATT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/142859.html