PEP 799 – Python 프로파일링 도구를 정리하기 위한 전용 profiling 패키지
- Author:
- Pablo Galindo Salgado <pablogsal at python.org>, László Kiss Kollár <kiss.kollar.laszlo at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Type:
- Standards Track
- Created:
- 21-Jul-2025
- Python-Version:
- 3.15
- Post-History:
- 01-Aug-2025
- Resolution:
- 21-Aug-2025
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 Python의 내장 프로파일링 도구를 하나의 일관된 네임스페이스 아래에 정리하기 위해 profiling이라는 새 표준 라이브러리 모듈을 만들 것을 제안합니다.
이 PEP는 또한 레거시 순수 Python 추적 프로파일러인 profile 모듈을 폐지(deprecate)할 것을 제안합니다.
동기
현재 Python에는 profile과 cProfile이라는 두 가지 추적 프로파일러가 포함되어 있습니다. profile 모듈은 순수 Python으로 구현되어 있어 주로 교육용이거나 서브클래싱에 유용하지만, 실제로 사용하기에는 너무 느립니다. 반면 cProfile은 C로 구현되어 있어 실용적인 프로파일링 상황에 더 적합하지만, 몇 가지 동작 차이 때문에 profile을 그대로 대체할 수는 없습니다.
두 모듈 모두 추적 프로파일러이므로 모든 함수 호출과 반환을 계측합니다. 이 방식은 상당한 런타임 오버헤드를 유발하며, PEP 659에서 도입된 것과 같은 일부 인터프리터 최적화를 비활성화할 수 있습니다. 게다가 cProfile은 메인 스레드만 관찰하므로 현대의 동시성 Python 프로그램에서는 유용성이 떨어집니다. 혼란스럽게도 이 모듈들의 이름은 profile이 정식 도구인 것처럼 암시하지만, 실제로는 대체로 구식이 되었습니다.
Python 3.15에서는 profile.sample 아래에 새로운 샘플링 프로파일러가 도입되었습니다. tachyon이라는 이름으로 알려진 이 도구는 통계적 샘플링을 사용하여 성능 특성을 추론하므로 오버헤드 없는 프로파일링을 제공하며, 현대의 Python 인터프리터와도 더 잘 동작합니다. 또한 다중 스레드, 비동기 함수, 자유 스레딩 빌드 및 실행 중인 프로세스에 연결하는 기능을 지원합니다. 이러한 장점에도 불구하고 tachyon을 profile.sample 아래에 배치한 것은 오해를 불러일으키며 그 중요성을 가립니다.
현재 프로파일링 도구의 구성에는 일관되고 찾기 쉬운 구조가 없습니다. 제안하는 재구성은 사용자를 적절한 도구로 더 효과적으로 안내하고, 프로파일러 간의 방법론적 차이를 명확히 하며, 향후 확장을 위한 기반을 마련하기 위한 것입니다.
근거
이 재구성은 Python 프로파일링 도구의 오랜 문제 몇 가지를 해결합니다.
첫째, 모든 내장 프로파일러를 명확한 이름의 단일 네임스페이스 아래에 모아 발견 용이성을 향상합니다. 현재 프로파일링 도구는 이름이 일관되지 않고 관계가 불분명한 여러 모듈에 흩어져 있습니다. profiling 모듈을 도입하면 사용자는 프로파일링 기능을 탐색하고 이용할 수 있는, 잘 정의되고 직관적인 위치를 갖게 됩니다.
둘째, 이 제안은 하위 모듈의 이름을 그 기반 방법론에 따라 지정하여 명확성을 높입니다 – 결정론적 추적 프로파일러는 profiling.tracing으로, 통계적 샘플링 프로파일러는 profiling.sampling으로 지정합니다. 이러한 명시적인 분류는 각 도구의 동작과 한계를 이해하기 쉽게 하며, API를 사용자에게 권장하는 사고 모델과 일치시킵니다.
셋째, 권장 도구를 더 쉽게 찾고 사용할 수 있게 하여 개발자에게 지침을 제공합니다. 현재 구조에서는 단지 이름이 우선한다는 이유만으로 사용자가 profile과 같이 낡았거나 성능이 떨어지는 모듈에 의존하도록 잘못 유도될 수 있습니다. profiling 네임스페이스와 더 명확한 의미 체계 덕분에, 사용자는 낮은 오버헤드의 샘플링이든 상세한 추적이든 자신의 특정 사용 사례에 적합한 프로파일러를 선택할 가능성이 높아집니다.
마지막으로, 이 구조는 확장성을 촉진합니다. 프로파일링 도구를 통합된 네임스페이스 아래에 모으면, 관련 없는 모듈에 과도한 기능을 넣거나 중복된 최상위 이름을 추가하지 않고도 메모리 프로파일러, I/O 프로파일러, 하이브리드 도구 등 향후 프로파일링 기능을 간단하게 도입할 수 있습니다. profiling 모듈은 이를 위한 자연스러운 자리를 제공합니다.
명세
새 모듈 구조
이 PEP는 다음을 포함하는 새 profiling 모듈을 도입합니다:
profiling.tracing: 결정론적 함수 호출 추적입니다(cProfile에서 이전됨).profiling.sampling: 통계적 샘플링 프로파일러(tachyon)입니다.
cProfile 구현은 profiling.tracing으로 이전되며, cProfile은 하위 호환성을 위한 별칭으로 남습니다. tachyon 샘플링 프로파일러는 profiling.sampling에서 사용할 수 있게 됩니다.
profile의 폐지 예정
profile 모듈은 Python 3.15부터 폐지 예정으로 지정됩니다.
- Python 3.15:
profile을 임포트하면DeprecationWarning이 발생합니다. - Python 3.16:
profile을 어떤 방식으로든 사용하면DeprecationWarning이 발생합니다. - Python 3.17: 이 모듈은 표준 라이브러리에서 제거됩니다.
Python 3.15부터는 cProfile 및 profile보다 profiling.tracing을 사용하는 것이 권장됩니다.
이 문서를 작성하는 시점에 profile.sampling 모듈에 있는 코드는 profiling 패키지로 옮겨집니다.
문서
Python 문서는 새 profiling 모듈을 프로파일링 기능의 표준 진입점으로 사용합니다. 또한 추적 프로파일러와 샘플링 프로파일러의 차이를 설명하고, 각 유형이 언제 가장 적합한지에 대한 안내를 포함합니다.
cProfile 문서는 계속 제공되지만, 이에 대응하는 새 profiling 항목으로 연결됩니다.
하위 호환성
이 PEP에서 하위 호환성을 깨뜨리는 유일한 부분은 향후 profile 모듈을 제거하는 것이지만, 이는 PEP 387 절차에 따라 이루어집니다.
보안 영향
없습니다.
기각된 대안
cProfile 이름 변경
cProfile의 이름을 profile.tracing으로 바꾸는 방안도 검토되었지만, 이 변경은 방대한 양의 기존 코드에 영향을 줍니다. 원래 이름을 유지하면서 profiling.tracing 아래에 별칭을 두는 방식은 호환성과 명확성 사이의 균형을 이룹니다.
모듈 이름으로 profilers 사용
이 모듈은 처음에 profilers(복수형)로 제안되었으나, 커뮤니티 피드백에 따라 profiling(동명사형)으로 변경되었습니다. 동명사형은 기능의 범주를 나타내는 다른 Python 표준 라이브러리 모듈과 더 일관됩니다.
샘플링 프로파일러의 여러 이름
이 PEP의 이전 버전은 샘플링 프로파일러를 profiling.sampling과 profiling.tachyon이라는 두 가지 이름으로 제공하자고 제안했습니다. 이 방안은 혼란을 피하기 위해 기각되었습니다. 새 기능을 도입할 때는 여러 별칭을 두기보다 해당 기능에 접근하는 하나의 명확한 경로를 두는 것이 더 낫습니다. profiling.sampling이라는 이름은 프로파일링 방법론을 명확하게 드러내기 때문에 선택되었으며, “tachyon”은 문서에서 언급될 수 있는 내부 코드명으로 남습니다.
최상위 tachyon 모듈
import tachyon을 새로운 최상위 모듈로 도입하는 방안은 기각되었습니다. tachyon을 profiling 아래에 묶으면 논리적인 구조를 세우는 데 도움이 되고, 최상위 모듈이 무분별하게 늘어나는 것을 막으며, Python 운영 위원회(Python Steering Council)가 요청한 대로 전역 네임스페이스 사용도 최소화할 수 있습니다.
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.