선적 서류 비치
Pyinstrument는 Python 프로파일러입니다. 프로파일러는 코드를 최적화하고 더 빠르게 만드는 데 도움이 되는 도구입니다. 가장 큰 속도 향상을 얻으려면 프로그램의 가장 느린 부분에 집중해야 합니다. Pyinstrument가 그것을 찾는 데 도움이 됩니다!
☺️ 어디서부터 시작해야 할지 모르시나요? Calmcode.io의 비디오 튜토리얼을 확인해보세요!
pip install pyinstrument
Pyinstrument는 Python 3.8 이상을 지원합니다.
git 체크아웃에서 Pyinstrument를 실행하려면 빌드 단계가 있습니다. 자세한 내용은 기여를 살펴보세요.
pyinstrument 사용 방법을 배우거나 참조를 확인하려면 설명서를 참조하세요.
script.py
에 pickle
로 직렬화된 클래스가 포함되어 있는 pyinstrument script.py
사용하는 경우 직렬화 기계가 __main__
어디에 있는지 모르기 때문에 오류가 발생할 수 있습니다. 해결 방법은 이 문제를 참조하세요. 2024년 10월 11일
HTML 렌더러가 많이 개선되었습니다!
타임라인 모드 - 대화형 선형 타임라인을 보고 확대해 보세요!
이제 HTML 모드에는 사전 설정이 필요하지 않고 대화형 옵션이 있습니다.
HTML 페이지 헤더의 디자인을 간소화했습니다.
HTML 호출 스택 보기는 화살표 키 탐색을 지원합니다.
'라이브러리' 코드를 감지하는 방식이 변경되었습니다. 이전에는 파일 경로에 '/lib/' 문자열이 있으면 라이브러리 코드로 간주되었습니다(기본적으로 축소되었습니다). 이제 pyinstrument는 프로필 타임에 Python 설치 경로와 활성 virtualenv/conda env를 캡처합니다. 여기에 저장된 파일은 라이브러리로 간주됩니다. 그러면 거짓 긍정이 줄어들 것입니다.
이제 profiler.start()에 대한 호출이 프로필 판독값에 표시되는 target_description 매개변수를 전달할 수 있습니다.
새로운 기능에 대한 자세한 내용은 내 블로그 게시물을 확인하세요.
2024년 9월 6일
glom
과 같은 패키지를 가져오지 못하게 하는 버그를 수정합니다. 이로 인해 locals() 딕셔너리가 변경됩니다. (#336)UnicodeDecodeError
일으키는 버그 수정(#330)2024년 8월 5일
2024년 8월 2일
2024년 8월 1일
with
블록이나 함수/메서드 데코레이터를 사용하여 간단하게 프로파일링할 수 있습니다. 그러면 코드가 프로파일링되고 짧은 판독값이 터미널에 인쇄됩니다. (#327)flat
인수를 추가합니다(#294).2024년 1월 26일
show_all
옵션을 추가합니다.2023년 11월 8일
%pyinstrument
에서 원하지 않는 변수 확장이 있는 버그를 수정합니다(#278).2023년 10월 12일
python -c
와 같이 명령줄에서 직접 코드를 프로파일링할 수 있는 -c
기능을 추가합니다. (#271)Profiler.write_html
을 추가합니다. (#266)2023년 9월 7일
2023년 9월 1일
2023년 7월 22일
__tracebackhide__
로 인해 프레임이 삭제되었을 때 출력에 [X frames hidden]
이 발생하는 버그 수정(#255)None
을 표시하는 버그 수정(#254)2023년 6월 5일
-p flat
전달하여 활성화할 수 있는 플랫 모드를 콘솔 렌더러에 추가합니다. 이 모드는 자체 시간으로 측정된 가장 무거운 프레임을 표시하며, 이는 일부 코드베이스에서 유용할 수 있습니다. (#240)pstats
파일을 저장하는 기능을 추가합니다. 이는 stdlib의 cprofile이 사용하는 파일 형식입니다. pyinstrument 프로필보다 덜 상세하지만 더 많은 도구와 호환됩니다. (#236)--show-all
옵션의 세부 사항을 수정합니다. 이 옵션이 제공되면 pyinstrument는 더 이상 Python 내부 프레임을 제거하지 않습니다. (#239)2022년 11월 5일
__traceback_hide__
지역 변수를 설정하는 프레임은 이제 출력에서 제거됩니다(#217).--async_mode=enabled
플래그를 사용하여 실행하는 경우 Jupyter/IPython 매직은 이제 async/await를 지원합니다. (#212)2022년 8월 21일
--interval
(초, 기본값 0.001)을 추가합니다. 이는 간격을 늘리면 메모리 오버헤드가 줄어드는 장기 실행 프로그램에 유용합니다. 렌더링 옵션을 임의로 설정할 수 있는 명령줄 옵션 -p
--render-option
추가합니다. 이렇게 하면 pyinstrument -p processor_options.filter_threshold=0
과 같은 작업을 수행하여 명령줄에서 filter_threshold
와 같은 옵션을 설정할 수 있습니다.
옵션에 대한 도움말 출력은 다음과 같습니다.
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
절대 시간이 아닌 백분율로 콘솔 출력의 시간을 볼 수 있는 기능을 추가합니다. ConsoleRenderer 옵션 time='percent_of_total'
사용하거나 명령줄에서 pyinstrument -p time=percent_of_total
처럼 -p
사용하세요.
pyinstrument 세션을 로드하고 저장하기 위한 명령줄 옵션을 추가합니다. pyinstrument -r session -o session.pyisession myscript.py
와 같이 -r session
사용하여 pyinstrument 세션에 대한 원시 데이터를 저장할 수 있습니다. 로딩은 --load
통해 이루어집니다(예: pyinstrument --load session.pyisession
.
명령줄 출력 형식은 -o
출력 파일 확장자에서 유추됩니다. 따라서 pyinstrument -o profile.html myscript.py
수행하면 -r html
제공할 필요가 없으며 pyinstrument는 자동으로 HTML 렌더러를 사용합니다. 또는 pyinstrument -o profile.pyisession myscript.py
수행하면 원시 세션 객체가 저장됩니다.
FastAPI 및 pytest의 사용 예제를 문서에 추가합니다.
async_mode=strict
사용할 때 NotImplementedError를 일으키는 버그를 수정합니다.
Python 3.11에 대한 지원 추가
%load_ext pyinstrument
사용한 다음 프로파일링하려는 셀에서 %%pyinstrument
사용하세요.pyinstrument -r speedscope
로 프로파일링하고 speedscope 웹 앱에 업로드하세요.PYINSTRUMENT_PROFILE_DIR_RENDERER
옵션을 사용하여 Django 미들웨어 파일 출력에 대한 렌더러를 구성할 수 있습니다.비동기 지원! 이제 Pyinstrument는 비동기 작업이 대기 상태에 도달할 때를 감지하고 이 대기 상태에서 비동기 컨텍스트 외부에서 보낸 시간을 추적합니다.
예를 들어 다음은 절전 모드를 수행하는 비동기 작업이 포함된 간단한 스크립트입니다.
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
Pyinstrument 4.0.0 이전에는 다음과 같이 런 루프에서 소요된 시간만 볼 수 있었습니다.
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
이제 pyinstrument 4.0.0을 사용하면 다음과 같은 이점을 얻을 수 있습니다.
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
자세한 내용은 비동기 프로파일링 설명서와 Profiler.async_mode 속성을 확인하세요.
Pyinstrument에는 전체 Python API 문서를 포함한 문서 사이트가 있습니다!
--show
, --show-regex
, --show-all
이 명령줄에서 무시되는 버그를 수정합니다.output_html()
및 open_in_browser()
에 timeline
옵션(부울)을 추가했습니다.pyinstrument -m module
문제가 해결되었습니다.Python -> C -> Python
Python -> Python
으로 기록되지만 Python -> Python -> C
올바르게 표시됩니다. (#103)<__array_function__ internals>
프레임 수정--show
및 --show-regex
옵션을 추가하여 표시할 특정 파일을 표시합니다. 이는 특정 모듈 내부를 프로파일링하는 동시에 다른 모듈을 숨기는 데 도움이 됩니다. 예를 들어 pyinstrument --show '*/sympy/*' script.py
입니다.Pyinstrument는 이제 기본적으로 사용 중인 라이브러리를 통해 추적을 숨깁니다. 따라서 urllib와 같은 외부 항목의 내부를 통과하는 많은 프레임을 표시하는 대신 코드에 집중할 수 있습니다.
전에 | 후에 |
---|---|
이전 동작으로 돌아가려면 명령줄에서 --show-all
사용하세요.
숨겨진 그룹의 '입력' 프레임이 표시되므로 어떤 통화가 문제인지 알 수 있습니다.
그룹의 매우 느린 프레임도 표시됩니다(예: 소켓에 대한 '읽기' 호출).
애플리케이션 코드가 콘솔에 강조표시됨
타임스탬프, 샘플 수, 기간, CPU 시간 등 추가 측정항목이 추적 상단에 표시됩니다.
숨겨진 코드는 코드 파일의 경로와 일치하는 --hide
또는 --hide-regex
옵션에 의해 제어됩니다.
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
타임라인 출력은 명령줄에서 지원됩니다.
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
이제 몇 가지 렌더링 옵션이 있으므로 --load-prev
사용하여 이전 프로파일링 세션을 로드할 수 있습니다. pyinstrument는 마지막 10개 세션을 유지합니다.
숨겨진 그룹은 다음과 같은 애플리케이션 코드로 다시 호출할 수도 있습니다.
(내부) 타임라인을 기록할 때 이제 프레임 트리가 완전히 선형이므로 매우 정확한 프레임 차트를 생성할 수 있습니다.
(내부) HTML 렌더러가 Vue.js 앱으로 다시 작성되었습니다. 모든 콘솔 개선 사항은 HTML 출력에도 적용되며 대화형입니다.
(내부) 많은 단위 및 통합 테스트가 추가되었습니다!
으악! 자세한 내용은 #49를 참조하세요. 당신이 그것을 좋아하길 바랍니다.
Recorders
제거되었습니다. 이제 프레임 기록이 Profiler
개체 내부에 있습니다. 이는 '프레임' 객체가 보다 범용적이라는 것을 의미하며, 이는 다음을 위한 길을 열어줍니다.--version
명령줄 옵션 추가 JSON 출력에 대한 지원이 추가되었습니다. pyinstrument --renderer=json scriptfile.py
사용하세요. 홍보
@iddan은 JSON 출력을 사용하여 대화형 뷰어를 구성했습니다!
pyinstrument --html
실행하고 출력을 파일로 파이프하지 않으면 pyinstrument는 콘솔 출력을 임시 파일에 쓰고 브라우저에서 엽니다.
-m
플래그입니다(예: pyinstrument -m module_name
!). 홍보 이제 Pyinstrument를 with
블록에서 사용할 수 있습니다.
예를 들어:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
이전 버전의 Django에 대한 미들웨어 수정
Pyinstrument는 새로운 프로파일링 모드를 사용합니다 . 신호를 사용하는 대신 pyintrument는 PyEval_SetProfile에 구축된 새로운 통계 프로파일러를 사용합니다. 이는 더 이상 메인 스레드 제한이 없고 Pyinstrument를 사용할 때 더 이상 IO 오류가 없으며 별도의 'setprofile' 모드가 필요하지 않음을 의미합니다!
렌더러 . 사용자는 Profiler.output()
의 renderer
인수를 사용하거나 명령줄에서 --renderer
인수를 사용하여 대체 렌더러를 사용하도록 Pyinstrument를 사용자 정의할 수 있습니다.
녹음기 . Pyinstrument의 다른 사용 사례(예: Flame Chart)를 지원하기 위해 이제 Pyinstrument에는 '타임라인' 레코더 모드가 있습니다. 이 모드는 캡처된 프레임을 선형 방식으로 기록하므로 프로그램 실행을 타임라인에서 볼 수 있습니다.
pyinstrument
명령. 이제 $ pyinstrument script.py
실행하여 셸에서 Python 스크립트를 프로파일링할 수 있습니다. 이는 이제 python -m pyinstrument
와 동일합니다. @asmeurer님 감사합니다!쉽게 찾을 수 있도록 HTML 추적에서 애플리케이션 코드가 강조표시됩니다.
지정된 폴더의 파일에 대한 모든 요청의 프로필을 기록하는 PYINSTRUMENT_PROFILE_DIR
옵션을 Django 인터페이스에 추가했습니다. API 호출을 프로파일링하는 데 유용합니다.
신호 모드에 문제가 있을 때 사용하기 위해 Django 인터페이스에 PYINSTRUMENT_USE_SIGNAL
옵션을 추가했습니다.
개발 환경을 설정하려면:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
샘플 출력을 얻으려면 다음을 수행하십시오.
pyinstrument examples/wikipedia_article_word_count.py
테스트를 실행하려면 다음 안내를 따르세요.
pytest
Linting 검사를 로컬에서 실행하려면 다음 안내를 따르세요.
pre-commit run --all-files
isort
또는 black
과 같은 일부 사전 커밋 검사는 발견된 문제를 자동으로 수정합니다. 따라서 위 명령이 오류를 반환하는 경우 다시 실행해 보세요. 두 번째에는 성공할 수도 있습니다. :)
모든 검사를 실행하는 것은 느릴 수 있으므로 검사를 개별적으로 실행할 수도 있습니다(예: isort
또는 black
검사에 실패한 소스 코드의 형식 지정).
pre-commit run --all-files isort
pre-commit run --all-files black
pyright
검사가 실패하는 이유를 진단하려면 다음을 수행하십시오.
pre-commit run --all-files pyright
HTML 렌더러는 모든 웹 브라우저에서 볼 수 있는 HTML 파일 내에 Javascript '번들'과 함께 샘플의 JSON 표현을 삽입하여 작동합니다.
HTML 렌더러 스타일을 편집하려면 다음을 수행하십시오.
cd html_renderer
npm ci
npm run serve
최상위 window.profileSession
객체 없이 실행되면 작업할 수 있도록 샘플 프로필을 가져옵니다.
JS 앱을 컴파일하고 pyinstrument Python 도구에 다시 번들링하려면 다음을 수행하세요.
bin/build_js_bundle.py [--force]