Как я могу профилировать код Python построчно?

I ' Я использую 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)".

Есть Это имеет смысл? Есть ли какая-либо библиотека профилирования, которая собирает такую ​​информацию? Есть ли какой-нибудь замечательный инструмент, который я пропустил?

104
задан Peter Mortensen 18 August 2018 в 13:06
поделиться