어떻게 Python 표준 라 이브 러 리 를 사용 하여 성능 테스트 를 합 니까?
3849 단어 python표준 라 이브 러 리성능 테스트
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 를 포함 하 는 줄 만 출력 합 니 다.실제 출력 결 과 는 다음 과 같다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.