-
[Python] 초보자를 위한 cProfile로 코드 최적화하기코딩/파이썬 2023. 8. 1. 14:05반응형
cProfile은 Python의 내장 프로파일러로, Python 코드를 최적화하는 데 도움이 됩니다. 이 글에서는 cProfile이 무엇인지, 그리고 어떻게 사용하는지 알아보도록 하겠습니다.
1. cProfile이란?
- cProfile은, 코드 성능 최적화를 위해, 프로그램의 실행시간과 메모리 사용량을 측정하는 도구이다.
프로파일링은 애플리케이션의 실행 시간과 메모리 사용량을 정밀하게 측정하고, 최적화할 부분을 찾는 과정입니다. Python에서는 이를 위해 cProfile이라는 내장 프로파일러를 제공합니다.
cProfile은 Python의 표준 라이브러리에 포함되어 있어 추가적인 설치 없이 사용할 수 있습니다. 이 도구는 코드의 각 부분이 얼마나 오래 걸리는지, 얼마나 자주 호출되는지 등을 정확하게 측정할 수 있게 해줍니다.
이는 실제 프로덕션 환경에서 발생하는 성능 문제를 재현하고 분석하는 데 매우 유용하며, 특히 복잡한 애플리케이션에서 성능의 병목 현상을 찾아내는 데 필수적인 도구입니다.아래는 cProfile에 대한 Python 공식 문서입니다.
https://docs.python.org/ko/3/library/profile.html
cProfile을 이용하면, 코드 실행시간을 분석해 줍니다.
2. cProfile 사용하기
cProfile을 사용하는 방법은 다양합니다. 여기에서는 기본적인 사용 방법을 소개하고, 간단한 코드 최적화 예제를 통해 cProfile을 어떻게 활용하는지 알아보도록 하겠습니다.
2.1. 기본적인 사용 방법 - console에서 사용하기
- "-m cProfile" 옵션으로 콘솔에서 성능 분석을 할 수 있다.
cProfile을 사용하는 가장 간단한 방법은 Python 코드를 실행할 때 -m cProfile 옵션을 추가하는 것입니다.
예를 들어, myscript.py라는 파이썬 스크립트에 대해 cProfile을 실행하려면 다음과 같이 할 수 있습니다.python -m cProfile myscript.py
이 명령을 실행하면, 스크립트의 각 함수에 대한 실행 횟수, 전체 실행 시간, 평균 실행 시간 등의 정보가 콘솔에 출력됩니다.
2.2. 코드 내에서 cProfile 사용하기
- cProfile.run 을 통해서 코드 내에 성능 분석을 할 수 있다.
cProfile은 코드 내에서 직접 사용할 수도 있습니다. cProfile.run() 함수를 사용하면 특정 코드 블록의 프로파일을 수집할 수 있습니다. 다음은 cProfile.run() 함수의 사용 예제입니다.
import cProfile def my_func(): return sum( [ i for i in range(100000) ] ) cProfile.run('my_func()') ### 출력 결과 #6 function calls in 0.019 seconds # Ordered by: standard name # # ncalls tottime percall cumtime percall filename:lineno(function) # 1 0.002 0.002 0.019 0.019 2334038239.py:3(my_func) # 1 0.014 0.014 0.014 0.014 2334038239.py:5(<listcomp>) # 1 0.000 0.000 0.019 0.019 <string>:1(<module>) # 1 0.000 0.000 0.019 0.019 {built-in method builtins.exec} # 1 0.003 0.003 0.003 0.003 {built-in method builtins.sum} # 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
cProfile.run() 함수는 문자열 형태로 전달된 Python 코드를 실행하고, 해당 코드의 프로파일을 콘솔에 출력합니다. 이 함수를 사용하면 특정 함수나 코드 블록의 성능을 측정하고 분석하는데 도움이 됩니다.
2.3. with문의 컨텍스트를 이용한 cProfile 사용하기
- python 3.8 부터 with 문 내에서 cProfile을 실행할 수 있다.
Python의 with 문을 사용하면 cProfile의 결과를 더욱 효과적으로 관리하고 분석할 수 있습니다. with 문은 컨텍스트 관리자라는 특별한 객체를 사용하여 코드 블록을 실행하고, 해당 블록이 종료될 때 정리 작업을 수행합니다.
cProfile은 cProfile.Profile() 객체를 통해 with 문과 함께 사용될 수 있습니다. 이 객체는 프로파일링을 시작하고, with 문이 종료될 때 자동으로 프로파일링을 중지합니다.
다음은 with 문을 사용하여 cProfile을 활용하는 예제입니다:import cProfile def my_func(): return sum( [ i for i in range(100000) ] ) with cProfile.Profile() as pr: my_func() pr.print_stats() # 프로파일링 통계를 출력합니다.
3. cProfile 결과 분석하기
cProfile의 출력은 상당히 많은 정보를 포함하고 있습니다. 주요 정보는 다음과 같습니다.
- ncalls:
함수가 호출된 횟수입니다. 이는 함수가 얼마나 자주 사용되는지 알려줍니다. - tottime:
함수 자체의 총 실행 시간을 나타냅니다. 하위 함수의 시간은 제외합니다. - percall (tottime/ncalls):
한 번 함수를 호출할 때 평균적으로 걸리는 시간입니다. - cumtime:
함수와 그 함수 내에서 호출한 모든 하위 함수들의 총 실행 시간입니다.
이 정보들을 통해 어떤 함수가 프로그램 성능에 가장 큰 영향을 미치는지 판단하고, 그 부분을 개선하여 코드의 성능을 향상시킬 수 있습니다.
https://smart-worker.tistory.com/59
https://smart-worker.tistory.com/59
반응형'코딩 > 파이썬' 카테고리의 다른 글
[Python] Pandas에서 결측치 보간하기 - interpolate 함수 이용법 (0) 2023.08.04 [Python] Pandas에서 NaN,NA 대체/제거하기: fillna, dropna (0) 2023.08.04 [python] 딕셔너리에서 기본값 설정하기 (0) 2023.08.01 [Python] zip함수로 두 리스트의 데이터 엮어주기 (0) 2023.07.31 [Python] 파이썬 enumerate 함수로 For 문 돌리기 (0) 2023.07.31