Документация
Pyinstrument — это профилировщик Python. Профилировщик — это инструмент, который поможет вам оптимизировать ваш код и сделать его быстрее. Чтобы добиться максимального увеличения скорости, вам следует сосредоточиться на самой медленной части вашей программы. Pyinstrument поможет вам найти его!
☕️ Не знаете с чего начать? Посмотрите этот видеоурок на сайте quietcode.io!
pip install pyinstrument
Pyinstrument поддерживает Python 3.8+.
Чтобы запустить Pyinstrument из git checkout, необходимо выполнить этап сборки. Дополнительную информацию см. в разделе «Вклад».
Чтобы узнать, как использовать pyinstrument или проверить ссылку, обратитесь к документации.
pyinstrument script.py
, где script.py
содержит класс, сериализованный с помощью pickle
, вы можете столкнуться с ошибками, поскольку механизм сериализации не знает, где находится __main__
. См. эту проблему для обходных путей. 11 октября 2024 г.
Множество улучшений в средстве визуализации HTML!
Режим временной шкалы — просматривайте и увеличивайте интерактивную линейную временную шкалу!
Режим HTML теперь имеет интерактивные параметры, вместо необходимости предварительной настройки.
Оптимизирован дизайн заголовка HTML-страницы.
Представление стека вызовов HTML поддерживает навигацию с помощью клавиш со стрелками.
Изменен способ обнаружения «библиотечного» кода. Раньше, если в пути к файлу встречалась строка «/lib/», это считалось кодом библиотеки (и по умолчанию сворачивалось). Теперь pyinstrument фиксирует пути установки Python и любую активную среду virtualenv/conda во время профиля. Файлы, хранящиеся там, считаются библиотекой. Это должно дать меньше ложных срабатываний.
Вызовы Profiler.start() теперь могут передавать параметр target_description, который отображается в показаниях профиля.
Дополнительную информацию о новых функциях можно найти в моем блоге.
6 сентября 2024 г.
glom
в Python 3.12 или новее, что изменяло словарь locals(). (#336)UnicodeDecodeError
на некоторых платформах (#330).5 августа 2024 г.
2 августа 2024 г.
1 августа 2024 г.
with
или декоратор функции/метода. Это профилирует код и выведет краткое показание на терминал. (#327)flat
аргумент в вывод консоли для представления плоского списка функций (#294).26 января 2024 г.
show_all
в Profiler.output_html.8 ноября 2023 г.
%pyinstrument
(#278).12 октября 2023 г.
-c
, которая позволяет профилировать код непосредственно из командной строки, например python -c
. (#271)Profiler.write_html
для прямой записи вывода HTML в файл. (#266)7 сентября 2023 г.
1 сентября 2023 г.
22 июля 2023 г.
[X frames hidden]
при удалении кадров из-за __tracebackhide__
(#255).None
в выводе консоли (#254).5 июня 2023 г.
-p flat
в командной строке. В этом режиме отображается самый тяжелый кадр, измеренный по собственному времени, что может быть полезно в некоторых базах кода. (#240)pstats
. Это формат файла, используемый cprofile в stdlib. Он менее подробный, чем профили pyinstrument, но совместим с большим количеством инструментов. (#236)--show-all
— pyinstrument больше не будет удалять внутренние фреймы Python, когда указана эта опция. (#239)5 ноября 2022 г.
__traceback_hide__
, теперь будут удалены из вывода (#217).--async_mode=enabled
. (#212)21 августа 2022 г.
--interval
(секунды, по умолчанию 0,001), чтобы изменить интервал, в течение которого pyinstrument производит выборку программы. Это полезно для долго выполняющихся программ, где увеличение интервала снижает нагрузку на память. Добавляет параметр командной строки -p
--render-option
, который позволяет произвольную настройку параметров рендеринга. Это позволяет вам устанавливать такие параметры, как filter_threshold
из командной строки, выполнив что-то вроде pyinstrument -p processor_options.filter_threshold=0
.
Вот вывод справки для этой опции:
-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'
или в командной строке используйте -p
, например pyinstrument -p time=percent_of_total
.
Добавляет параметры командной строки для загрузки и сохранения сеансов pyinstrument. Вы можете сохранить необработанные данные для сеанса pyinstrument с помощью -r session
, например pyinstrument -r session -o session.pyisession myscript.py
. Загрузка осуществляется через --load
, например pyinstrument --load session.pyisession
.
Формат вывода командной строки определяется расширением выходного файла -o
. Поэтому, если вы используете pyinstrument -o profile.html myscript.py
, вам не нужно указывать -r html
, pyinstrument автоматически будет использовать средство визуализации HTML. Или, если вы выполните pyinstrument -o profile.pyisession myscript.py
, он сохранит необработанный объект сеанса.
Добавляет в документацию примеры использования FastAPI и pytest.
Исправляет ошибку, вызывающую NotImplementedError при использовании async_mode=strict
.
Добавляет поддержку Python 3.11.
%load_ext pyinstrument
в верхней части блокнота, а затем %%pyinstrument
в ячейке, которую вы хотите профилировать.pyinstrument -r speedscope
и загрузите в веб-приложение Speedscope.PYINSTRUMENT_PROFILE_DIR_RENDERER
.Поддержка асинхронности! 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 есть сайт документации, включающий полную документацию по API Python!
--show
, --show-regex
, --show-all
игнорировались в командной строке.timeline
(логическая) в методы профилировщика output_html()
и open_in_browser()
.pyinstrument -m module
, из-за которой pyinstrument не находил модули в текущем каталоге.Python -> C -> Python
записывается как Python -> Python
, но Python -> Python -> C
будет атрибутироваться правильно. (#103)<__array_function__ internals>
отображаемые как код приложения в отчетах.--show
и --show-regex
, чтобы пометить определенные файлы для отображения. Это помогает профилировать внутри определенных модулей, скрывая при этом другие. Например, pyinstrument --show '*/sympy/*' script.py
.Pyinstrument теперь будет скрывать следы библиотек, которые вы используете по умолчанию. Таким образом, вместо того, чтобы показывать вам множество кадров, проходящих через внутренности чего-то внешнего, например urllib, он позволяет вам сосредоточиться на своем коде.
До | После |
---|---|
Чтобы вернуться к старому поведению, используйте --show-all
в командной строке.
Отображаются рамки входа скрытых групп, чтобы вы знали, в каком вызове возникла проблема.
Также отображаются действительно медленные кадры в группах, например, вызов чтения в сокете.
Код приложения подсвечивается в консоли
Дополнительные метрики отображаются в верхней части трассировки — временная метка, количество выборок, продолжительность, время процессора.
Скрытый код контролируется опциями --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 и нет необходимости в отдельном режиме «setprofile»!
Рендереры . Пользователи могут настроить Pyinstrument для использования альтернативных средств визуализации с помощью аргумента renderer
в Profiler.output()
или с помощью аргумента --renderer
в командной строке.
Регистраторы . Для поддержки других вариантов использования Pyinstrument (например, диаграмм пламени), pyinstrument теперь имеет режим записи «временной шкалы». В этом режиме захваченные кадры записываются линейно, поэтому выполнение программы можно просмотреть на временной шкале.
pyinstrument
. Теперь вы можете профилировать скрипты Python из оболочки, запустив $ pyinstrument script.py
. Теперь это эквивалентно python -m pyinstrument
. Спасибо @asmeurer!Код приложения выделяется в HTML-трассах, чтобы его было легче обнаружить.
В интерфейс Django добавлена опция PYINSTRUMENT_PROFILE_DIR
, которая записывает профили всех запросов в файл в указанной папке. Полезно для профилирования вызовов 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
Чтобы запустить проверку линтинга локально:
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 работает путем внедрения JSON-представления образца с «пакетом» Javascript внутри HTML-файла, который можно просмотреть в любом веб-браузере.
Чтобы отредактировать стиль рендеринга HTML, выполните:
cd html_renderer
npm ci
npm run serve
При запуске без объекта window.profileSession
верхнего уровня он получит образец профиля, чтобы вы могли с ним работать.
Чтобы скомпилировать приложение JS и связать его обратно с инструментом Python pyinstrument:
bin/build_js_bundle.py [--force]