天天看點

python測試代碼運作時間_在Python中準确地測量代碼執行時間

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

測量代碼執行時間是困難的。學習如何消除系統和随機測量誤差,并獲得更可靠的結果。

我們經常需要測量代碼的特定部分執行需要多長時間。不幸的是,簡單地測量函數調用之前和之後的系統時間并不是很嚴謹,而且容易受到系統和随機測量錯誤的影響。這對于測量非常短的間隔(< 100毫秒)來說尤其如此。

系統和随機誤差

那麼,下面這種測量方法有什麼問題呢?

python測試代碼運作時間_在Python中準确地測量代碼執行時間

首先,這裡會有一個系統誤差:通過調用time.perf_counter(), 一個未知量的時間會被加入到my_function()的執行時間中。多少時間呢?這取決于作業系統、特定的實作和其他不可控因素。

其次,還存在一個随機誤差:對my_function()調用的執行時間在一定程度上會有變化。

我們可以通過多次測量并取其平均值來抵抗随機誤差。然而,消除系統誤差的難度要大得多。

直線拟合

卡洛斯·莫雷諾和塞巴斯蒂安·菲什邁斯特提出了一種新技術來減小這種系統性錯誤。基本思想是首先測量一個函數調用的時間,然後測量兩個函數調用的時間,然後測量三個函數調用的時間,依此類推。最終的方法可能是這樣的:

python測試代碼運作時間_在Python中準确地測量代碼執行時間

然後你可以通過測量結果來拟合一條直線:

python測試代碼運作時間_在Python中準确地測量代碼執行時間

總執行時間可以通過擷取該直線y = a x + b的斜率a得到。

在上面的例子中,直線是y = 205.91 x + 29.56;是以,執行時間等于205.91毫秒。

作者指出,這種測量方法對于偶爾會出現大誤差的測量是非常可靠的。這可以通過人為地改變第4次測量并重新運作直線拟合過程來視覺化:

python測試代碼運作時間_在Python中準确地測量代碼執行時間

盡管有一個值是完全偏離的,但我們得出的斜率(201.15)仍然非常接近之前的測量值。

想要更多地了解這種方法的數學基礎知識,我邀請你閱讀這篇原創性論文:https://uwaterloo.ca/embedded-software-group/sites/ca.embedded-software-group/files/uploads/files/ieee-esl-precise-measurements.pdf

Python實作

你可以在我的公共GitLab倉庫中找到我對所展示算法的實作:https://gitlab.com/bernhard.knasmueller/accurate-time-measurements-python

這個算法和想法都要歸功于Moreno 和 Fischmeister。

編輯于2020年1月18日:更正了perf_counter()的用法。

相關文章

如何将你的PHP代碼作為一個Composer包釋出:https://knasmueller.net/how-to-publish-your-php-code-as-a-composer-package

你可以通過将你的庫作為一個composer貢獻給PHP社群來更容易地共享你的代碼…

PHP 7.3中的尾逗号:https://knasmueller.net/trailing-commas-in-php-7-3

随着新的次要版本PHP 7.3的更新,函數調用中引入了尾逗号……英文原文:https://knasmueller.net/measure-code-execution-time-accurately-in-python

譯者:憂郁的紅秋褲