Python 은 어떻게 당신 의 프로그램 에 성능 테스트 를 합 니까?
프로그램 이 실행 되 는 데 걸 리 는 시간 을 테스트 하고 성능 테스트 를 하고 싶 습 니 다.
해결 방안
프로그램 전체 에 걸 리 는 시간 을 간단하게 테스트 하고 싶다 면 보통 유 닉 스 시간 함 수 를 사용 하면 됩 니 다.예 를 들 어:
bash % time python3 someprogram.py
real 0m13.937s
user 0m12.162s
sys 0m0.098s
bash %
프로그램 에 대한 자세 한 보고 가 필요 하 다 면 cProfile 모듈 을 사용 할 수 있 습 니 다.
bash % python3 -m cProfile someprogram.py
859647 function calls in 16.016 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
263169 0.080 0.000 0.080 0.000 someprogram.py:16(frange)
513 0.001 0.000 0.002 0.000 someprogram.py:30(generate_mandel)
262656 0.194 0.000 15.295 0.000 someprogram.py:32(<genexpr>)
1 0.036 0.036 16.077 16.077 someprogram.py:4(<module>)
262144 15.021 0.000 15.021 0.000 someprogram.py:4(in_mandelbrot)
1 0.000 0.000 0.000 0.000 os.py:746(urandom)
1 0.000 0.000 0.000 0.000 png.py:1056(_readable)
1 0.000 0.000 0.000 0.000 png.py:1073(Reader)
1 0.227 0.227 0.438 0.438 png.py:163(<module>)
512 0.010 0.000 0.010 0.000 png.py:200(group)
...
bash %
그러나 통상 적 인 상황 은 이 두 극단 사이 에 있다.예 를 들 어 코드 가 실 행 될 때 소수의 함수 에서 대부분의 시간 을 썼 다 는 것 을 이미 알 고 있다.이 함수 들 의 성능 테스트 에 대해 간단 한 장식 기 를 사용 할 수 있 습 니 다.
# timethis.py
import time
from functools import wraps
def timethis(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
r = func(*args, **kwargs)
end = time.perf_counter()
print('{}.{} : {}'.format(func.__module__, func.__name__, end - start))
return r
return wrapper
이 장식 기 를 사용 하려 면 성능 테스트 를 하려 는 함수 정의 앞 에 놓 으 면 됩 니 다.예 를 들 어:
>>> @timethis
... def countdown(n):
... while n > 0:
... n -= 1
...
>>> countdown(10000000)
__main__.countdown : 0.803001880645752
>>>
코드 블록 실행 시간 을 테스트 하려 면 컨 텍스트 관리 자 를 정의 할 수 있 습 니 다.예 를 들 어:
from contextlib import contextmanager
@contextmanager
def timeblock(label):
start = time.perf_counter()
try:
yield
finally:
end = time.perf_counter()
print('{} : {}'.format(label, end - start))
다음은 이 컨 텍스트 관리 자 를 사용 하 는 예 입 니 다.
>>> with timeblock('counting'):
... n = 10000000
... while n > 0:
... n -= 1
...
counting : 1.5551159381866455
>>>
아주 작은 코드 세 션 의 운행 성능 을 테스트 할 때 timeit 모듈 을 사용 하 는 것 이 편리 합 니 다.예 를 들 어:
>>> from timeit import timeit
>>> timeit('math.sqrt(2)', 'import math')
0.1432319980012835
>>> timeit('sqrt(2)', 'from math import sqrt')
0.10836604500218527
>>>
timeit 는 첫 번 째 매개 변수 에서 문 구 를 100 만 번 실행 하고 운행 시간 을 계산 합 니 다.두 번 째 매개 변 수 는 테스트 를 실행 하기 전에 환경 을 설정 하 는 것 입 니 다.순환 실행 횟수 를 바 꾸 려 면 number 인자 의 값 을 아래 와 같이 설정 할 수 있 습 니 다.
>>> timeit('math.sqrt(2)', 'import math', number=10000000)
1.434852126003534
>>> timeit('sqrt(2)', 'from math import sqrt', number=10000000)
1.0270336690009572
>>>
토론 하 다.성능 테스트 를 수행 할 때 주의해 야 할 것 은 당신 이 얻 은 결 과 는 모두 근사치 입 니 다.time.perf_counter()함 수 는 주어진 플랫폼 에서 최고 정밀도 의 시간 값 을 가 져 옵 니 다.그러나 이것 은 여전히 시계 시간 을 바탕 으로 하기 때문에 많은 요소 가 기계 부하 와 같은 정확도 에 영향 을 줄 수 있다.실행 시간 에 더 관심 이 있다 면 time.process 를 사용 하 세 요.대신 time().예 를 들 면:
from functools import wraps
def timethis(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.process_time()
r = func(*args, **kwargs)
end = time.process_time()
print('{}.{} : {}'.format(func.__module__, func.__name__, end - start))
return r
return wrapper
마지막 으로 더 깊이 있 는 성능 분석 을 하려 면 time,timeit 와 다른 관련 모듈 의 문 서 를 자세히 읽 어야 합 니 다.이렇게 하면 플랫폼 과 관련 된 차이 와 다른 함정 을 이해 할 수 있다.13.13 소절 에 연 결 된 타이머 클래스 를 만 드 는 예 도 참고 할 수 있다.이상 은 Python 이 어떻게 당신 의 프로그램 에 성능 테스트 를 하 는 지 에 대한 상세 한 내용 입 니 다.Python 이 성능 테스트 를 하 는 것 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.