Есть ли статистический профилировщик для python? Если нет, то как я могу написать его?

Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()
17
задан shino 11 April 2011 в 04:39
поделиться

3 ответа

Через семь лет после того, как вопрос был задан, в настоящее время для Python доступно несколько хороших статистических профилировщиков. Помимо vmprof, уже упомянутого Дмитрием Трофимовым в в этом ответе, существуют также vprof и pyflame . Все они поддерживают графики пламени , так или иначе, давая вам хороший обзор того, где было потрачено время.

1
ответ дан 30 November 2019 в 13:03
поделиться

Остин - это сэмплер стека кадров для CPython, который можно использовать для создания статистических профилировщиков для Python, которые не требуют никаких инструментов и вводят минимальные издержки. Самое простое, что нужно сделать, это передать вывод Остина с FlameGraph. Однако вы можете просто получить вывод Остина с помощью специального приложения, чтобы создать собственный профилировщик, который точно соответствует вашим потребностям.

Это скриншот Austin TUI, терминального приложения, которое обеспечивает вид сверху всего, что происходит внутри работающего приложения Python. Austin TUI

Это веб-приложение для веб-поиска в Остине, которое отображает график живого пламени собранных образцов. Вы можете настроить адрес, по которому приложение будет обслуживать приложение, которое затем позволяет выполнять удаленное профилирование.

enter image description here

1
ответ дан 30 November 2019 в 13:03
поделиться

Я могу подумать о паре нескольких способов сделать это:

  • Вместо того, чтобы пытаться получить трассировку стека во время работы программы, просто запустить прерывание и проанализировать вывод. Вы можете сделать это с помощью сценария оболочки или другого сценария Python, который вызывает ваше приложение в качестве подпроцесса. Основная идея объясняется и довольно тщательно защищается в , этот ответ на специфический для C ++ вопрос .

    • На самом деле, вместо анализа выходных данных, вы можете зарегистрировать подпрограмму посмертного (используя sys.excepthook ), которая регистрирует трассировку стека. К сожалению, у Python нет возможности продолжить с того момента, когда произошло исключение, поэтому вы не можете возобновить выполнение после регистрации.
  • Чтобы фактически получить трассировку стека от работающей программы, вам, возможно, придется взломать реализацию. Поэтому, если вы действительно хотите это сделать, возможно, стоит потратить время на ознакомление с pypy , реализацией Python, написанной в основном на Python. Я понятия не имею, насколько удобно было бы делать это в pypy. Я предполагаю, что это не было бы особенно удобно, так как это включало бы введение хука практически в каждую инструкцию, что, я думаю, было бы чрезмерно неэффективным. Кроме того, я не думаю, что будет больше преимуществ по сравнению с первым вариантом, если только не требуется очень много времени, чтобы достичь состояния, в котором вы хотите начать выполнять трассировку стека.

  • Существует набор макросов для отладчика gdb, предназначенный для облегчения отладки самого Python. GDB может подключаться к внешнему процессу (в данном случае к экземпляру Python, который выполняет ваше приложение) и делать с ним что угодно. Похоже, что макрос pystack вернет вам стек Python в текущей точке выполнения. Я думаю, было бы довольно легко автоматизировать эту процедуру, так как вы можете (в худшем случае) просто вставить текст в gdb, используя expect или что-то еще.

5
ответ дан 30 November 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: