通過修飾器實現函數運行時間的計算
在之前介紹Python修飾器的幾篇文章中,提到修飾器的一種應用場景——計算並列印代碼執行時間,如下 runtime 修飾器:
我們使用 runtime 修飾器,對需要關注執行時間函數進行修飾,如下
遇見 Timeit
Python 內置模塊 timeit 模塊與 time 模塊都可以實現對代碼運行時間的計算,但 timeit 模塊是專門用來測試代碼運行時間的,提供了更多靈活的計算方法,並且相對精度也會更高。
我們先來看一下,同樣計算一個函數的運行時間,使用 timeit 如何實現。
不難看出,timeit 還是比較靈活簡單的。接下來,我們深入的了解一下 timeit 模塊常用的兩個函數 。
timeit 函數
創建一個 Timer實例,返回運行 stmt 這段代碼 number 遍所用的時間,單位為秒。
語法
參數說明
- stmt:用於傳入要測試時間的代碼,可以直接接受字符串的表達式,也可以接受單個變量,也可以接受函數。傳入函數時要把函數申明在當前文件中,然後在 stmt = 'func()' 執行函數,然後使用 setup = 'from main import func'。
- setup:初始化代碼或構建環境的導入語句,比如 stmt中使用到的參數、變量,要導入的模塊等,多行語句的話,使用分號分隔,同時該語句不計入時間,一般是 from ... import ...。
- timer:計時函數,win32下是time.clock(),linux下是 time.time(),Python的標準庫手冊推薦在任何系統下都儘量使用 time.clock()。
- number:默認 100000,每一次測量中語句被執行的次數。
示例
執行上述代碼,輸出結果為:
如果我們只是想計算 com函數裡 sum([i 2 for i in rn]) 代碼的運行時間,我們可以直接使用 timeit.timeit 方法,上述代碼可以調整為:
repeat 函數
創建一個 Timer實例,通過repeat 參數指定重複測試的次數,返回包含每次測試的執行時間的列表,利用這一函數可以很方便得實現多次試驗取平均的方法。
語法
參數說明
- stmt:用於傳入要測試時間的代碼,可以直接接受字符串的表達式,可以接受單個變量或者函數。傳入函數時要把函數申明在當前文件中,然後在 stmt = 'func()' 執行函數,然後使用 setup = 'from main import func'。
- setup:初始化代碼或構建環境的導入語句,比如 stmt中使用到的參數、變量,要導入的模塊等,多行語句的話,使用分號分隔,同時該語句不計入時間,一般是 from ... import ...。
- timer:計時函數,win32下是 time.clock(),linux下是 time.time(),Python的標準庫手冊推薦在任何系統下都儘量使用 time.clock()。
- repeat:默認3次,測試要重複幾次,每次的結果構成列表返回。
- number:默認100000次,每一次測量中語句被執行的次數。
示例
執行上述代碼,輸出結果為: