Python: Tprof, 타깃팅 프로파일러

발행: (2026년 1월 15일 오후 06:00 GMT+9)
5 min read

Source: Hacker News

Python: 타깃 프로파일러 tprof 소개

프로파일러는 전체 프로그램의 성능을 측정해 어느 부분에서 가장 많은 시간이 소요되는지 파악합니다. 하지만 목표 함수가 정해진 뒤, 최적화가 도움이 되었는지 확인하기 위해 전체 프로그램을 다시 프로파일링하는 과정은 느리고 번거로울 수 있습니다. 프로파일러는 실행에 오버헤드를 추가하고, 보고서에서 관심 있는 단일 함수의 통계만 골라내야 합니다. 저는 Django의 시스템 체크 프레임워크를 최적화할 때(이전 글)와 같이 클라이언트 혹은 오픈소스 프로젝트를 최적화하면서 이 과정을 여러 번 겪었습니다.

이러한 불편함을 해소하고자 tprof 를 만들었습니다. tprof는 Python 3.12+에서 사용할 수 있는 타깃 프로파일러로, 지정한 목표 함수에서만 소요된 시간을 측정합니다. 최적화 전후에 프로그램을 실행해 차이를 확인하고, 명령줄에서 간단히 보고서를 확인할 수 있습니다.

예를 들어 [pathlib.Path](https://docs.python.org/3/library/pathlib.html#pathlib.Path) 객체 생성이 코드의 병목임을 알게 되었다면, 다음과 같이 tprof를 실행할 수 있습니다:

비교 모드로 벤치마크

코드를 최적화할 때 “전”과 “후” 버전처럼 여러 함수를 비교하고 싶을 때가 있습니다. tprof는 비교 모드를 제공하는데, 이 모드는 보고서에 “delta” 열을 추가해 각 함수가 기준 함수에 비해 얼마나 빠른지 혹은 느린지를 보여줍니다.

def before():
    total = 0
    for i in range(100_000):
        total += i
    return total

def after():
    return sum(range(100_000))

for _ in range(100):
    before()
    after()

…다음과 같이 tprof를 실행하면 두 함수를 비교할 수 있습니다:

$ tprof -x -t before -t after -m example
🎯 tprof results:
 function         calls total  mean ± σ      min … max   delta
 example:before()   100 227ms   2ms ± 34μs   2ms … 2ms   -
 example:after()    100  86ms 856μs ± 15μs 835μs … 910μs -62.27%

출력 결과는 after()가 이 경우 before()보다 약 60 % 빠름을 보여줍니다.

Python API

tprof는 컨텍스트 매니저 / 데코레이터 형태인 tprof() 를 통해 Python API도 제공합니다. 이를 사용해 특정 코드 블록 안에서 함수들을 프로파일링할 수 있습니다.

from tprof import tprof

def before():
    total = 0
    for i in range(100_000):
        total += i
    return total

def after():
    return sum(range(100_000))

with tprof(before, after, compare=True):
    for _ in range(100):
        before()
        after()

스크립트를 실행하면 다음과 같은 출력이 나타납니다:

$ python example.py
🎯 tprof results:
 function          calls total  mean ± σ      min … max delta
 __main__:before()   100 227ms   2ms ± 83μs   2ms … 3ms -
 __main__:after()    100  85ms 853μs ± 22μs 835μs … 1ms -62.35%

작동 원리

tprof는 Python의 sys.monitoring 을 사용합니다. 이는 Python 3.12에서 새롭게 도입된 API로, 함수나 코드 라인이 실행될 때 이벤트를 트리거합니다. sys.monitoring 을 통해 tprof는 특정 목표 함수에만 콜백을 등록할 수 있어, 프로그램의 나머지 부분에는 전혀 오버헤드를 추가하지 않습니다. 타이밍은 C 레벨에서 수행되어 오버헤드가 더욱 최소화됩니다.

sys.monitoring 을 CPython에 기여해준 Mark Shannon에게 감사드립니다! 저는 이 기능을 두 번째로 사용합니다—첫 번째는 예상치 못한 변이를 추적할 때였으며(이전 글).

마무리

tprof가 유용해 보인다면 한번 사용해 보시고 의견을 알려 주세요! 좋아하는 패키지 매니저를 이용해 PyPI에서 tprof 를 설치할 수 있습니다.

—Adam

Back to Blog

관련 글

더 보기 »