반응형
프로파일링은 함수의 호출, 반환, 예외를 추적하고, 각 함수 호출과 이벤트를 추적합니다. 프로파일링으로 상대적으로 리소스를 많이 소비되는 부분을 찾아서 성능 개선에 집중할 수 있습니다. 파이썬은 인터프리터 언어로 프로파일링에 상대적으로 적은 자원이 소비됩니다. 파이썬(python)에서는 표준 라이브러리로 cProfile, profile을 제공하는데, 이번 포스트에서는 cProfile의 사용법을 확인해 보겠습니다.
파이썬 버전은 비교적 최신 버전은 3.8을 다룹니다.
import cProfile
def mysum(num):
return sum( [i for i in range(num)])
def sum_of_mysum(num):
return [ mysum(i) for i in range(1,num) ]
# run 의 인자로 실행할 코드 입력합니다.
cProfile.run( 'sum_of_mysum(10000)' )
위의 코드를 실행하면 아래의 결과를 확인할 수 있습니다.
출력결과를 보면 mysum, sum_of_mysum 함수와 listcomp의 실행시간을 확인할 수 있습니다.
상세 칼럼의 의미는 아래와 같습니다.
- ncalls : 함수의 호출 횟수
- tottime : 해당 함수 실행에 사용된 전체 시간
- percall : tottime/ncalls
- cumtime : 해당 함수와 모든 자식 함수의 누적 시간
- percall : cumtime의 percall(cumtime/number)
- filename:lineno(functon) : 파일/함수/라인번호
파이썬 3.8 부터는 컨텍스트를 이용해 프로파일링을 할 수 있습니다.
import cProfile
def mysum(num):
return sum( [i for i in range(num)])
def sum_of_mysum(num):
return [ mysum(i) for i in range(1,num) ]
with cProfile.Profile() as pr:
sum_of_mysum(10000)
pr.print_stats() # 프로파일링 통계를 출력합니다.
이 경우에도 동일한 결과를 얻을 수 있습니다.
프로파일링에 대한 개념과 한계는 파이썬 문서를 참고하십시요
https://docs.python.org/ko/3.8/library/profile.html
결정론적 프로파일링이란 무엇입니까?
결정론적 프로파일링(Deterministic profiling)이라는 용어는 모든 함수 호출, 함수 반환 및 예외 이벤트가 모니터링되고, (사용자 코드가 실행되는 시간 동안) 이러한 이벤트 사이의 간격에 대한 정확한 시간 측정이 이루어진다는 사실을 반영하기 위한 것입니다. 반면에, 통계적 프로파일링(statistical profiling)(이 모듈에서는 수행하지 않습니다)은 유효 명령어 포인터를 무작위로 샘플링하여 시간이 소비되는 위치를 추론합니다. 후자의 기술은 전통적으로 (코드를 계측할 필요가 없기 때문에) 오버헤드가 적지만, 시간이 어디에서 소비되는지에 대한 상대적 표시만 제공합니다.
파이썬에서는, 실행 중에 인터프리터가 활성화되어있어서, 결정론적 프로파일링을 수행하기 위해 인스트루먼트 된 코드(instrumented code)가 필요하지 않습니다. 파이썬은 각 이벤트에 대해 자동으로 훅(hook)(선택적 콜백)을 제공합니다. 또한, 파이썬의 인터프리터 적인 성격은 실행에 이미 많은 오버헤드를 추가하는 경향이 있어서, 결정론적 프로파일링은 일반적인 응용 프로그램에서 작은 처리 오버헤드만 추가하는 경향이 있습니다. 결과적으로 결정론적 프로파일링은 그다지 비싸지 않으면서도, 파이썬 프로그램의 실행에 대한 광범위한 실행 시간 통계를 제공합니다.
호출 수 통계를 사용하여 코드의 버그(놀랄만한 횟수)를 식별하고, 가능한 인라인 확장 지점(높은 호출 횟수)을 식별할 수 있습니다. 내부 시간 통계를 사용하여 신중하게 최적화해야 하는 《핫 루프(hot loops)》를 식별할 수 있습니다. 누적 시간 통계를 사용하여 알고리즘 선택에서의 고수준 에러를 식별할 수 있습니다. 이 프로파일러에서의 누적 시간의 특이한 처리는 알고리즘의 재귀 구현에 대한 통계를 반복 구현과 직접 비교할 수 있도록 함에 유의하십시오.
반응형
'통계, 개발, 데이타 > Python' 카테고리의 다른 글
파이썬(python) 로깅하기 - import logging #1 (0) | 2021.07.10 |
---|---|
파이썬(python) multiprocessing (0) | 2021.07.03 |
댓글