어떻게 Python 표준 라 이브 러 리 를 사용 하여 성능 테스트 를 합 니까?

Profile 과 cProfile
Python 표준 라 이브 러 리 에는 성능 테스트 를 할 수 있 는 두 개의 모듈 이 있다.
1.하 나 는 Profile 입 니 다.이것 은 순수한 Python 의 실현 이기 때문에 좀 느 릴 것 입 니 다.만약 에 모듈 을 확장 해 야 한다 면 이 모듈 이 적당 합 니 다.
2.두 번 째 는 cProfile 입 니 다.이름 에서 알 수 있 듯 이 이것 은 C 언어의 실현 판 입 니 다.공식 적 으로 추천 하 는 것 은 대부분 상황 에서 사용 합 니 다.
이 두 가지 인터페이스 와 데이터 의 출력 형식 은 완전히 같 습 니 다.이 두 가지 사이 에서 자 유 롭 게 전환 할 수 있 습 니 다.따라서 다음은 cProfile 을 예 로 들 어 소개 하 겠 습 니 다.
cProfile 을 사용 하여 성능 테스트 를 진행 합 니 다.
cProfile 에서 성능 테스트 는 매우 간단 합 니 다.run 방법 을 호출 하고 테스트 가 필요 한 함수 와 파 라 메 터 를 전달 하면 됩 니 다.다음은 fib(n)에 대해 성능 테스트 를 진행 하 겠 습 니 다.

import cProfile

def fib(n):
 if n == 0:
 return 0
 if n == 1:
 return 1
 return fib(n-1) + fib(n-2)

if __name__ == '__main__':
 cProfile.run('fib(30)')
성능 테스트 결 과 는 다음 과 같다.

모두 2692539 번 의 함수 호출 이 진행 되 었 고 모두 0.815 초 걸 렸 음 을 볼 수 있 습 니 다.다음 줄 마다 함수 호출 상황 에 대응 합 니 다.그 중:
1.ncalls,함수 총 호출 횟수;
2.tottime,이 함수 호출 에 총 시간 이 걸 립 니 다.
3.percall,모든 호출 의 평균 시간;
4.cumtime,총 누적 소비 시간;
5.percall,모든 호출 의 평균 누적 시간;
6.filename:lineno(function),대응 함수 정보.
그래서 그림 에서 거의 시간 이 fib 에 소모 되 고 함수 호출 수가 너무 많은 것 을 볼 수 있 습 니 다.이것 은 함수 가 재 귀적 으로 호출 되 고 불필요 한 분기 가 많이 발생 하기 때문에 프로그램 이 최적화 되 어야 합 니 다.두 가지 방법 으로 개선 할 수 있 습 니 다.하 나 는 캐 시 fib(n)의 정보 입 니 다.매번 계산 할 필요 가 없습니다.둘째,절 차 를 교체 식 으로 바 꾸 는 것 이다.
함수 값 을 캐 시 합 니 다.Python 3 에 간단 한 장식 기 를 lru 라 고 합 니 다.cache,수 동 으로 저장 하지 않 고 자동 으로 캐 시 함수 의 값 을 저장 할 수 있 습 니 다.

import functools

@functools.lru_cache(maxsize=None)
def fib(n):
 if n == 0:
 return 0
 if n == 1:
 return 1
 return fib(n-1) + fib(n-2)
실행 결 과 는 다음 과 같 습 니 다.

이 를 통 해 알 수 있 듯 이 fib 함 수 는 31 번 만 호출 되 었 고 거의 모든 추가 호출 은 캐 시 에 명중 되 었 으 며 앞의 호출 횟수 보다 훨씬 적 고 운행 시간 도 상당히 뚜렷하게 향상 되 었 다.아래 의 교체 판 프로그램 을 사용 하 는 것 도 매우 빨리 실행 되 므 로 여 기 는 더 이상 전개 되 지 않 습 니 다.

def fib(n):
 prev, cur = 0, 1
 if n == 0:
 return prev
 if n == 1:
 return cur
 count = 1
 while count < n:
 count += 1
 prev, cur = cur, prev + cur
 return cur
앞에서 언급 한 run 방법 외 에 runctx 라 는 방법 도 있어 서 문맥 적 인 파 라 메 터 를 제공 할 수 있 습 니 다.예 를 들 어 앞의 cProfile.run('fib(30)')은 cProfile.runctx('fib',globals(),{'n':30})의 마지막 운행 결 과 는 같 습 니 다.
마지막 으로 명령 행 에 직접 인쇄 하 는 방식 을 제외 하고 run 과 runctx 는 두 번 째 매개 변 수 를 통 해 파일 이름 을 전달 하 는 방식 으로 출력 결 과 를 파일 에 기록 할 수 있 습 니 다.
pstats 를 사용 하여 디 스 플레이 를 제어 합 니 다.
cProfile 은 프로그램 에 대해 간단 한 성능 테스트 를 할 수 있 지만 프로그램 이 너무 크 고 호출 함수 가 많 을 때 테스트 결 과 를 여과 하고 정렬 하 는 도구 가 필요 합 니 다.pstats 는 바로 이러한 도구 입 니 다.

# fib_profile.py
import cProfile
import pstats

for i in range(5):
 cProfile.run('fib(1000)', 'fib_profile_{}'.format(i))

stats = pstats.Stats('fib_profile_0')
for i in range(1, 5):
 stats.add('fib_profile_{}'.format(i))
stats.strip_dirs()
stats.sort_stats('cumulative')
stats.print_stats('fib')
위의 프로그램 은 먼저 여러 개의 테스트 결 과 를 기록 한 다음 에 stats 를 초기 화 했 습 니 다.stats 의 add 방법 으로 새로운 파일 을 추가 할 수 있 습 니 다.pstats 는 자동 으로 결 과 를 집합 합 니 다.그리고 stripdirs 는 파일 이름 앞 경 로 를 제거 하고 파일 이름 만 유지 합 니 다.sort_stats 는 출력 결 과 를 정렬 하 는 것 입 니 다.즉,앞에서 말 한 몇 줄 에서 선택 하 는 것 입 니 다(구체 적 인 것 은 공식 문 서 를 참조 할 수 있 습 니 다).마지막 printstats 는 결 과 를 출력 합 니 다.이 면 에서 줄 을 걸 러 낼 수 있 습 니 다.예 를 들 어 위의 프로그램 은 fib 를 포함 하 는 줄 만 출력 합 니 다.실제 출력 결 과 는 다음 과 같다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기