婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > python如何進(jìn)行基準(zhǔn)測(cè)試

python如何進(jìn)行基準(zhǔn)測(cè)試

熱門標(biāo)簽:蘇州電銷機(jī)器人十大排行榜 電信營業(yè)廳400電話申請(qǐng) 溫州旅游地圖標(biāo)注 外呼不封號(hào)系統(tǒng) 江蘇房產(chǎn)電銷機(jī)器人廠家 幫人做地圖標(biāo)注收費(fèi)算詐騙嗎 荊州云電銷機(jī)器人供應(yīng)商 遼寧400電話辦理多少錢 悟空智電銷機(jī)器人6

基準(zhǔn)測(cè)試屬于性能測(cè)試的一種,用于評(píng)估和衡量軟件的性能指標(biāo)。我們可以在軟件開發(fā)的某個(gè)階段通過基準(zhǔn)測(cè)試建立一個(gè)已知的性能水平,稱為"基準(zhǔn)線"。當(dāng)系統(tǒng)的軟硬件環(huán)境發(fā)生變化之后再進(jìn)行一次基準(zhǔn)測(cè)試以確定那些變化對(duì)性能的影響。 這是基準(zhǔn)測(cè)試最常見的用途。

Donald Knuth在1974年出版的《Structured Programming with go to Statements》提到:

毫無疑問,對(duì)效率的片面追求會(huì)導(dǎo)致各種濫用。程序員會(huì)浪費(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%的場(chǎng)景:過早的優(yōu)化是萬惡之源。
當(dāng)然我們也不應(yīng)該放棄對(duì)那關(guān)鍵3%的優(yōu)化。一個(gè)好的程序員不會(huì)因?yàn)檫@個(gè)比例小就裹足不前,他們會(huì)明智地觀察和識(shí)別哪些是關(guān)鍵的代碼;但是僅當(dāng)關(guān)鍵代碼已經(jīng)被確認(rèn)的前提下才會(huì)進(jìn)行優(yōu)化。對(duì)于很多程序員來說,判斷哪部分是關(guān)鍵的性能瓶頸,是很容易犯經(jīng)驗(yàn)上的錯(cuò)誤的,因此一般應(yīng)該借助測(cè)量工具來證明。

雖然經(jīng)常被解讀為不需要關(guān)心性能,但是的少部分情況下(3%)應(yīng)該觀察和識(shí)別關(guān)鍵代碼并進(jìn)行優(yōu)化。

基準(zhǔn)(benchmarking)測(cè)試工具

python中提供了非常多的工具來進(jìn)行基準(zhǔn)測(cè)試。

為了使演示的例子稍微有趣,我們來隨機(jī)生成一個(gè)列表,并對(duì)列表中數(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):
    """
    冒泡排序: 對(duì)列表進(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)測(cè)試非常方便。

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

以測(cè)試bubble_sort()函數(shù)為例。timeit.timeit() 參數(shù)說明。

  • stmt:需要測(cè)試的函數(shù)或語句,字符串形式.
  • setup: 運(yùn)行的環(huán)境,本例子中表示if __name__ == '__main__':.
  • number: 執(zhí)行的次數(shù),省缺則默認(rèn)是1000000次。所以你會(huì)看到運(yùn)行bubble_sort() 耗時(shí) 5秒多。

pyperf

https://github.com/psf/pyperf

pyperf 的用法與timeit比較類似,但它提供了更豐富結(jié)果。(注:我完全是發(fā)現(xiàn)了這個(gè)庫才學(xué)習(xí)基準(zhǔn)測(cè)試的)

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

測(cè)試結(jié)果會(huì)寫入bench.json 文件。可以使用pyperf stats命令分析測(cè)試結(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單元測(cè)試框架的一個(gè)插件。 單獨(dú)編寫單元測(cè)試用例:

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)行測(cè)試用例:

❯ 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ù),你會(huì)得到一張圖表

❯ 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)測(cè)試的工具還有很多,這里就不再介紹了。

經(jīng)過基準(zhǔn)測(cè)試發(fā)現(xiàn)程序變慢了,那么接下來需要做的就是代碼性能分析了,我下篇再來介紹。

以上就是python如何進(jìn)行基準(zhǔn)測(cè)試的詳細(xì)內(nèi)容,更多關(guān)于python 基準(zhǔn)測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python測(cè)試框架unittest和pytest區(qū)別
  • python使用pytest接口自動(dòng)化測(cè)試的使用
  • python 如何用 Hypothesis 來自動(dòng)化單元測(cè)試
  • python 如何在測(cè)試中使用 Mock
  • python 基于DDT實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試
  • Python自動(dòng)化測(cè)試基礎(chǔ)必備知識(shí)點(diǎn)總結(jié)
  • Python3 + Appium + 安卓模擬器實(shí)現(xiàn)APP自動(dòng)化測(cè)試并生成測(cè)試報(bào)告
  • 基于Python的接口自動(dòng)化unittest測(cè)試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解
  • Appium+Python實(shí)現(xiàn)簡單的自動(dòng)化登錄測(cè)試的實(shí)現(xiàn)

標(biāo)簽:喀什 景德鎮(zhèn) 三沙 臺(tái)灣 欽州 濟(jì)南 黃山 宿遷

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python如何進(jìn)行基準(zhǔn)測(cè)試》,本文關(guān)鍵詞  python,如何,進(jìn)行,基準(zhǔn),測(cè)試,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python如何進(jìn)行基準(zhǔn)測(cè)試》相關(guān)的同類信息!
  • 本頁收集關(guān)于python如何進(jìn)行基準(zhǔn)測(cè)試的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 温泉县| 托克逊县| 塘沽区| 诏安县| 象山县| 辽宁省| 普格县| 沾化县| 洪江市| 万年县| 嘉黎县| 天长市| 清流县| 绵竹市| 大洼县| 高州市| 获嘉县| 堆龙德庆县| 印江| 巴楚县| 肥乡县| 耒阳市| 徐州市| 奈曼旗| 会昌县| 松原市| 济源市| 专栏| 潞西市| 温州市| 安康市| 屯门区| 兰溪市| 徐水县| 枣庄市| 沙洋县| 康马县| 焉耆| 容城县| 达拉特旗| 澄迈县|