在實際問題中,可能會遇到比較解決同一問題的不同方法之間的性能差異。而Python 提供了一個度量工具,爲這些問題提供了直接答案。
從查閱資料的情況來看,測試運行時間的調用的模塊主要有:time,timeit,datetime,profile 和pstats。其中,profile 和pstats模塊提供了針對更大代碼塊的時間度量工具。以下主要以time,timeit,datetime爲例進行說明。
1 time模塊測試程序運行時間
在time模塊中,計算時間的函數有兩個time()和clock()。其中,time(time.time(),time返回的是UTC時間(seconds since the 00:00:00 UTC on January 1)。在很多系統,包括windows下精度很差,win32下的精度只有1/18.2秒。不過在Unix/Linux系統下,time()的精度還是很高的。)time()是計算現實世界的時間,而clock()是cpu 時鐘。如果程序計算量不是很大,time()可能無法計算時間,從而導致程序測試失敗。而clock()是利用cpu 時鐘,時間計算精度較高。對比測試程序如下:
import time
#利用time.clock()計時測試
start_time1 = time.clock()
i = 0
string = 'ILoveFishC.com'
while i < len(string):
print(i, end=' ')
i += 1
end_time1 = time.clock()
time1 = end_time1-start_time1
print('\nRunning time1:', time1)
#利用time.time()計時測試
start_time2 = time.time()
i = 0
string = 'ILoveFishC.com'
while i < len(string):
print(i, end=' ')
i += 1
end_time2 = time.time()
time2 = end_time2-start_time2
print('\nRunning time2:', time2)
輸出結果爲:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Running time1: 3.2431984176475974e-05
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Running time2: 0.0
從中可以看出,time.time()用於測試運行時間是有限的,對於某些較短或運算量不大的程序是無法測量的。
2 timeit模塊測試程序運行時間
- timeit 模塊定義了接受兩個參數的 Timer 類。兩個參數都是字符串。 第一個參數是你要計時的語句或者函數。 傳遞給 Timer 的第二個參數是爲第一個參數語句構建環境的導入語句。 從內部講, timeit 構建起一個獨立的虛擬環境, 手工地執行建立語句,然後手工地編譯和執行被計時語句。
- 一旦有了 Timer 對象,最簡單的事就是調用 timeit(),它接受一個參數爲每個測試中調用被計時語句的次數,默認爲一百萬次;返回所耗費的秒數。
- Timer 對象的另一個主要方法是 repeat(), 它接受兩個可選參數。 第一個參數是重複整個測試的次數,第二個參數是每個測試中調用被計時語句的次數。 兩個參數都是可選的,它們的默認值分別是 3 和 1000000。 repeat() 方法返回以秒記錄的每個測試循環的耗時列表。Python 有一個方便的 min 函數可以把輸入的列表返回成最小值,如: min(t.repeat(3, 1000000))
- 你可以在命令行使用 timeit 模塊來測試一個已存在的 Python 程序,而不需要修改代碼。
from timeit import Timer
print(Timer("sum(range(100))").timeit())
輸出結果爲:
1.547405913377044
3 datetime模塊測試程序運行時間
import datetime def time_1(): begin = datetime.datetime.now() sum(range(10000000)) end = datetime.datetime.now() time = end - begin return time print(time_1())輸出結果爲:
0:00:00.470582