Я использовал 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)".
Имеет ли это смысл? Есть ли библиотека профилирования, которая собирает информацию такого типа? Есть ли какой-то потрясающий инструмент, который я пропустил?