python程序運行時間的幾種分析方法

    在實際問題中,可能會遇到比較解決同一問題的不同方法之間的性能差異。而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

datetime模塊測試程序運行時間

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章