Python 은 어떻게 당신 의 프로그램 에 성능 테스트 를 합 니까?

4472 단어 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 이 성능 테스트 를 하 는 것 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기