python如何進(jìn)行基準(zhǔn)測試
基準(zhǔn)測試屬于性能測試的一種,用于評估和衡量軟件的性能指標(biāo)。我們可以在軟件開發(fā)的某個(gè)階段通過基準(zhǔn)測試建立一個(gè)已知的性能水平,稱為"基準(zhǔn)線"。當(dāng)系統(tǒng)的軟硬件環(huán)境發(fā)生變化之后再進(jìn)行一次基準(zhǔn)測試以確定那些變化對性能的影響。 這是基準(zhǔn)測試最常見的用途。
Donald Knuth在1974年出版的《Structured Programming with go to Statements》提到:
毫無疑問,對效率的片面追求會導(dǎo)致各種濫用。程序員會浪費(fèi)大量的時(shí)間在非關(guān)鍵程序的速度上,實(shí)際上這些嘗試提升效率的行為反倒可能產(chǎn)生很大的負(fù)面影響,特別是當(dāng)調(diào)試和維護(hù)的時(shí)候。我們不應(yīng)該過度糾結(jié)于細(xì)節(jié)的優(yōu)化,應(yīng)該說約97%的場景:過早的優(yōu)化是萬惡之源。
當(dāng)然我們也不應(yīng)該放棄對那關(guān)鍵3%的優(yōu)化。一個(gè)好的程序員不會因?yàn)檫@個(gè)比例小就裹足不前,他們會明智地觀察和識別哪些是關(guān)鍵的代碼;但是僅當(dāng)關(guān)鍵代碼已經(jīng)被確認(rèn)的前提下才會進(jìn)行優(yōu)化。對于很多程序員來說,判斷哪部分是關(guān)鍵的性能瓶頸,是很容易犯經(jīng)驗(yàn)上的錯(cuò)誤的,因此一般應(yīng)該借助測量工具來證明。
雖然經(jīng)常被解讀為不需要關(guān)心性能,但是的少部分情況下(3%)應(yīng)該觀察和識別關(guān)鍵代碼并進(jìn)行優(yōu)化。
基準(zhǔn)(benchmarking)測試工具
python中提供了非常多的工具來進(jìn)行基準(zhǔn)測試。
為了使演示的例子稍微有趣,我們來隨機(jī)生成一個(gè)列表,并對列表中數(shù)字進(jìn)行排序。
import random def random_list(start, end, length): """ 生成隨機(jī)列表 :param start: 隨機(jī)開始數(shù) :param end: 隨機(jī)結(jié)束數(shù) :param length: 列表長度 """ data_list = [] for i in range(length): data_list.append(random.randint(start, end)) return data_list def bubble_sort(arr): """ 冒泡排序: 對列表進(jìn)行排序 :param arr 列表 """ n = len(arr) for i in range(n): for j in range(0, n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr if __name__ == '__main__': get_data_list = random_list(1, 99, 10) ret = bubble_sort(get_data_list) print(ret)
運(yùn)行結(jié)果如下:
❯ python .\demo.py [8, 16, 22, 31, 42, 58, 66, 71, 73, 91]
timeit
timeit是python自帶的模塊,用來進(jìn)行基準(zhǔn)測試非常方便。
if __name__ == '__main__': import timeit get_data_list = random_list(1, 99, 10) setup = "from __main__ import bubble_sort" t = timeit.timeit( stmt="bubble_sort({})".format(get_data_list), setup=setup ) print(t)
運(yùn)行結(jié)果:
❯ python .\demo.py 5.4201355
以測試bubble_sort()函數(shù)為例。timeit.timeit() 參數(shù)說明。
- stmt:需要測試的函數(shù)或語句,字符串形式.
- setup: 運(yùn)行的環(huán)境,本例子中表示if __name__ == '__main__':.
- number: 執(zhí)行的次數(shù),省缺則默認(rèn)是1000000次。所以你會看到運(yùn)行bubble_sort() 耗時(shí) 5秒多。
pyperf
pyperf 的用法與timeit比較類似,但它提供了更豐富結(jié)果。(注:我完全是發(fā)現(xiàn)了這個(gè)庫才學(xué)習(xí)基準(zhǔn)測試的)
if __name__ == '__main__': get_data_list = random_list(1, 99, 10) import pyperf setup = "from __main__ import bubble_sort" runner = pyperf.Runner() runner.timeit(name="bubble sort", stmt="bubble_sort({})".format(get_data_list), setup=setup)
運(yùn)行結(jié)果:
❯ python .\demo.py -o bench.json ..................... bubble sort: Mean +- std dev: 5.63 us +- 0.31 us
測試結(jié)果會寫入bench.json 文件??梢允褂胮yperf stats命令分析測試結(jié)果。
❯ python -m pyperf stats bench.json Total duration: 15.9 sec Start date: 2021-04-02 00:17:18 End date: 2021-04-02 00:17:36 Raw value minimum: 162 ms Raw value maximum: 210 ms Number of calibration run: 1 Number of run with values: 20 Total number of run: 21 Number of warmup per run: 1 Number of value per run: 3 Loop iterations per value: 2^15 Total number of values: 60 Minimum: 4.94 us Median +- MAD: 5.63 us +- 0.12 us Mean +- std dev: 5.63 us +- 0.31 us Maximum: 6.41 us 0th percentile: 4.94 us (-12% of the mean) -- minimum 5th percentile: 5.10 us (-9% of the mean) 25th percentile: 5.52 us (-2% of the mean) -- Q1 50th percentile: 5.63 us (+0% of the mean) -- median 75th percentile: 5.81 us (+3% of the mean) -- Q3 95th percentile: 5.95 us (+6% of the mean) 100th percentile: 6.41 us (+14% of the mean) -- maximum Number of outlier (out of 5.07 us..6.25 us): 6
pytest-benchmark
https://github.com/ionelmc/pytest-benchmark
pytest-benchmark是 pytest單元測試框架的一個(gè)插件。 單獨(dú)編寫單元測試用例:
from demo import bubble_sort def test_bubble_sort(benchmark): test_list = [5, 2, 4, 1, 3] result = benchmark(bubble_sort, test_list) assert result == [1, 2, 3, 4, 5]
需要注意:
- 導(dǎo)入bubble_sort() 函數(shù)。
- benchmark 作為鉤子函數(shù)使用,不需要導(dǎo)入包。前提是你需要安裝pytest和pytest-benchmark。
- 為了方便斷言,我們就把要排序的數(shù)固定下來了。
運(yùn)行測試用例:
❯ pytest -q .\test_demo.py . [100%] ------------------------------------------------ benchmark: 1 tests ----------------------------------------------- Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS (Kops/s) Rounds Iterations ------------------------------------------------------------------------------------------------------------------- test_bubble_sort 1.6000 483.2000 1.7647 2.6667 1.7000 0.0000 174;36496 566.6715 181819 1 ------------------------------------------------------------------------------------------------------------------- Legend: Outliers: 1 Standard Deviation from Mean; 1.5 IQR (InterQuartile Range) from 1st Quartile and 3rd Quartile. OPS: Operations Per Second, computed as 1 / Mean 1 passed in 1.98s
加上 --benchmark-histogram
參數(shù),你會得到一張圖表
❯ pytest -q .\test_demo.py --benchmark-histogram . [100%] ------------------------------------------------ benchmark: 1 tests ----------------------------------------------- Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS (Kops/s) Rounds Iterations ------------------------------------------------------------------------------------------------------------------- test_bubble_sort 1.6000 53.9000 1.7333 0.3685 1.7000 0.0000 1640;37296 576.9264 178572 1 ------------------------------------------------------------------------------------------------------------------- Generated histogram: D:\github\test-circle\article\code\benchmark_20210401_165958.svg
圖片如下:
關(guān)于基準(zhǔn)測試的工具還有很多,這里就不再介紹了。
經(jīng)過基準(zhǔn)測試發(fā)現(xiàn)程序變慢了,那么接下來需要做的就是代碼性能分析了,我下篇再來介紹。
以上就是python如何進(jìn)行基準(zhǔn)測試的詳細(xì)內(nèi)容,更多關(guān)于python 基準(zhǔn)測試的資料請關(guān)注腳本之家其它相關(guān)文章!
- python測試框架unittest和pytest區(qū)別
- python使用pytest接口自動化測試的使用
- python 如何用 Hypothesis 來自動化單元測試
- python 如何在測試中使用 Mock
- python 基于DDT實(shí)現(xiàn)數(shù)據(jù)驅(qū)動測試
- Python自動化測試基礎(chǔ)必備知識點(diǎn)總結(jié)
- Python3 + Appium + 安卓模擬器實(shí)現(xiàn)APP自動化測試并生成測試報(bào)告
- 基于Python的接口自動化unittest測試框架和ddt數(shù)據(jù)驅(qū)動詳解
- Appium+Python實(shí)現(xiàn)簡單的自動化登錄測試的實(shí)現(xiàn)
相關(guān)文章
使用python編寫簡單的小程序編譯成exe跑在win10上
這篇文章主要介紹了使用python編寫簡單的小程序編譯成exe跑在win10上的相關(guān)資料,需要的朋友可以參考下2018-01-01Python優(yōu)化列表接口進(jìn)行分頁示例實(shí)現(xiàn)
最近,在做測試開發(fā)平臺的時(shí)候,需要對測試用例的列表進(jìn)行后端分頁,在實(shí)際去寫代碼和測試的過程中,發(fā)現(xiàn)這里面還是有些細(xì)節(jié)的,故想復(fù)盤一下2021-09-09Python人工智能語音合成實(shí)現(xiàn)案例詳解
這篇文章主要為大家介紹了Python人工智能語音合成實(shí)現(xiàn)案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03python web基礎(chǔ)之加載靜態(tài)文件實(shí)例
下面小編就為大家分享一篇python web基礎(chǔ)之加載靜態(tài)文件實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03詳談pandas中agg函數(shù)和apply函數(shù)的區(qū)別
下面小編就為大家分享一篇詳談pandas中agg函數(shù)和apply函數(shù)的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04