Я использую cProfile для профилирования своего кода, и он отлично работает. Я также использую gprof2dot.py для визуализации результатов (делает их немного понятнее).
Однако cProfile (и большинство других профилировщиков Python, которые я видел до сих пор), похоже, профилирует только на уровне вызова функции. Это вызывает путаницу, когда определенные функции вызываются из разных мест - я не знаю, занимает ли вызов №1 или вызов №2 большую часть времени. Это становится еще хуже, когда рассматриваемая функция имеет шесть уровней глубины и вызывается из семи других мест.
Как получить профилирование по строкам?
Вместо этого:
function #12, total time: 2.0s
Хотелось бы увидеть что-то вроде этого:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile действительно показывает, какая часть общего времени «передается» родительскому объекту, но снова это соединение теряется, когда у вас есть группа уровней и взаимосвязанных вызовов.
В идеале мне бы хотелось иметь графический интерфейс, который бы анализировал данные, а затем показывал мне исходный файл с общим временем, отведенным на каждую строку. Что-то вроде этого:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Тогда я смогу щелкнуть второй вызов «func (c)», чтобы увидеть, что занимает время в этом вызове, отдельно от вызова «func (a)».
Имеет ли это смысл? Есть ли какая-либо библиотека профилирования, которая собирает такую информацию? Есть какой-нибудь замечательный инструмент, который я пропустил?
источник
pstats.print_callers
. Пример здесь .Ответы:
Я считаю, что это то, для чего предназначен line_profiler Роберта Керна . По ссылке:
Надеюсь, это поможет!
источник
import line_profiler;
а потом ?Вы также можете использовать pprofile ( pypi ). Если вы хотите профилировать все выполнение, это не требует модификации исходного кода. Вы также можете профилировать подмножество более крупной программы двумя способами:
переключать профилирование при достижении определенной точки в коде, например:
асинхронно переключить профилирование из стека вызовов (требуется способ запуска этого кода в рассматриваемом приложении, например обработчик сигнала или доступный рабочий поток) с помощью статистического профилирования:
Формат вывода аннотации кода очень похож на профилировщик строк:
Обратите внимание, что поскольку pprofile не полагается на модификацию кода, он может профилировать операторы модуля верхнего уровня, позволяя профилировать время запуска программы (сколько времени требуется для импорта модулей, инициализации глобальных объектов, ...).
Он может генерировать вывод в формате cachegrind, поэтому вы можете использовать kcachegrind для просмотра больших результатов.
Раскрытие информации: я автор профиля.
источник
Для этого вы можете воспользоваться помощью пакета line_profiler
1. Сначала установите пакет:
2. Используйте волшебную команду, чтобы загрузить пакет в среду Python / Notebook.
3. Если вы хотите профилировать коды для функции,
сделайте следующее:
вы получите красивый форматированный вывод со всеми подробностями, если выполните следующие действия :)
источник
Просто чтобы улучшить вышеупомянутый ответ @Joe Kington .
Для Python 3.x используйте line_profiler :
Монтаж:
Использование:
Предположим , у вас есть программа
main.py
и в ней, функцииfun_a()
иfun_b()
что вы хотите профилировать по времени; вам нужно будет использовать декоратор@profile
непосредственно перед определениями функций. Например,Программу можно профилировать, выполнив команду оболочки:
Аргументы можно получить, используя
$ kernprof -h
Результаты будут напечатаны на консоли как:
РЕДАКТИРОВАТЬ: результаты профилировщиков можно проанализировать с помощью пакета TAMPPA . Используя его, мы можем построчно получать желаемые графики как
источник
line_profiler
что не профилирует использование памяти (memory_profiler
делает, но часто дает сбой). Я бы рекомендовал использовать (мой) ЛЕСТНИЧНОЙ профайлер вместо этого, если вы на Mac OS X или Linux:pip install -U scalene
, github.com/emeryberger/scalene - (! И больше) он одновременно делает линейный уровень профилирование времени процессора и памяти .PyVmMonitor имеет просмотр в реальном времени, который может вам помочь (вы можете подключиться к запущенной программе и получить от нее статистику).
См .: http://www.pyvmmonitor.com/
источник