python 은 어떻게 기준 테스트 를 진행 합 니까?

기준 테스트 는 성능 테스트 의 일종 으로 소프트웨어 의 성능 지 표를 평가 하고 평가 하 는 데 쓰 인 다.우 리 는 소프트웨어 개발 의 한 단계 에서 기준 테스트 를 통 해 이미 알 고 있 는 성능 수준 을 구축 하여'기준 선'이 라 고 할 수 있다.시스템 의 소프트 하드웨어 환경 이 변화 한 후에 다시 한 번 기준 테스트 를 실시 하여 그 변화 가 성능 에 미 치 는 영향 을 확인한다.이것 은 기준 테스트 에서 가장 흔히 볼 수 있 는 용도 다.
Donald Knuth 는 1974 년 에 출판 된'Structured Programming with go to Statements'에서 다음 과 같이 언급 했다.
효율 에 대한 일방적인 추 구 는 각종 남용 을 초래 할 수 있다 는 것 은 의심의 여지 가 없다.프로그래머 들 은 비 관건 적 인 프로그램의 속도 에 많은 시간 을 낭비 할 것 이다.실제로 효율 을 높이 려 는 이러한 시 도 는 오히려 큰 부정적인 영향 을 미 칠 수 있다.특히 디 버 깅 과 유지 보수 할 때.우 리 는 세부 적 인 최적화 에 지나치게 얽 매 여 서 는 안 된다.약 97%의 장면 이 라 고 해 야 한다.너무 이 른 최적화 가 모든 악의 근원 이 라 고 해 야 한다.
물론 우리 도 그 관건 의 3%에 대한 최 적 화 를 포기 해 서 는 안 된다.좋 은 프로그래머 는 이 비율 이 작다 고 해서 앞으로 나 아가 지 않 을 것 이다.그들 은 어떤 것 이 관건 적 인 코드 인지 현명 하 게 관찰 하고 식별 할 것 이다.그러나 핵심 코드 가 확 인 된 전제 에서 만 최적화 된다.많은 프로그래머 들 에 게 어느 부분 이 관건 적 인 성능 병목 인지 판단 하 는 것 은 경험 적 인 오 류 를 범 하기 쉬 우 므 로 일반적으로 측정 도 구 를 통 해 증명 해 야 한다.
성능 에 관심 을 가 질 필요 가 없다 는 해석 이 자주 나 오지 만,적은 경우(3%)핵심 코드 를 관찰 하고 식별 해 최적화 해 야 한다.
기준(benchmarking)테스트 도구
python 에 서 는 기준 테스트 를 위해 매우 많은 도 구 를 제공 합 니 다.
프 리 젠 테 이 션 의 예 를 조금 재 미 있 게 하기 위해 서 목록 을 무 작위 로 만 들 고 목록 의 숫자 를 정렬 합 니 다.

import random


def random_list(start, end, length):
    """
          
    :param start:      
    :param end:      
    :param length:     
    """
    data_list = []
    for i in range(length):
        data_list.append(random.randint(start, end))
    return data_list


def bubble_sort(arr):
    """
        :        
    :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)
실행 결 과 는 다음 과 같 습 니 다.

❯ python .\demo.py
[8, 16, 22, 31, 42, 58, 66, 71, 73, 91]
timeit
timeit 는 python 이 자체 적 으로 가지 고 있 는 모듈 로 기준 테스트 를 하 는 데 매우 편리 합 니 다.

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)
실행 결과:

❯ python .\demo.py
5.4201355
테스트 버 블sort()함 수 를 예 로 들 면.timeit.timeit()매개 변수 설명.
  • stmt:테스트 해 야 할 함수 나 문장,문자열 형식.
  • setup:실행 환경,이 예 에서 ifname__ == '__main__':.
  • number:실행 횟수,성 결 은 기본적으로 1000000 회 입 니 다.그래서 버 블 을 운행 하 는 걸 보 게 될 거 야sort()는 5 초 이상 걸 립 니 다.
  • pyperf
    https://github.com/psf/pyperf
    pyperf 의 용법 은 timeit 와 비슷 하지만 더 풍부 한 결 과 를 제공 합 니 다.주:나 는 이 라 이브 러 리 를 완전히 발견 하고 기준 테스트 를 배 웠 다)
    
    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)
    실행 결과:
    
    ❯ python  .\demo.py -o bench.json
    .....................
    bubble sort: Mean +- std dev: 5.63 us +- 0.31 us
    테스트 결 과 는 Bench.json 파일 에 기 록 됩 니 다.pyperf stats 명령 으로 테스트 결 과 를 분석 할 수 있 습 니 다.
    
    ❯ 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 유닛 테스트 프레임 워 크 의 플러그 인 입 니 다.단원 테스트 용례 를 단독으로 작성 합 니 다:
    
    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]
    주의:
  • bubble 가 져 오기sort()함수.
  • benchmark 는 갈고리 함수 로 사용 되 며 가방 을 가 져 올 필요 가 없습니다.전 제 는 pytest 와 pytest-benchmark 를 설치 해 야 한 다 는 것 이다.
  • 은 단언 을 편리 하 게 하기 위해 서 우 리 는 정렬 할 수 있 는 수 를 고정 시 켰 다.
  • 실행 테스트 용례:
    
    ❯ 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 인 자 를 더 하면 도표 한 장 을 얻 을 수 있 습 니 다.
    
    ❯ 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
    그림 은 다음 과 같다.

    기준 테스트 에 관 한 도구 가 아직 많 으 니 더 이상 소개 하지 않 겠 습 니 다.
    기준 테스트 를 통 해 프로그램 이 느 려 진 것 을 발 견 했 습 니 다.그러면 다음 에 해 야 할 일 은 코드 성능 분석 입 니 다.다음 편 에서 소개 하 겠 습 니 다.
    이상 은 python 이 기준 테스트 를 어떻게 진행 하 는 지 에 대한 상세 한 내용 입 니 다.python 기준 테스트 에 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기