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]
timeittimeit 는 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()매개 변수 설명.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-benchmarkhttps://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]
주의:
❯ 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 기준 테스트 에 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.