Я використовував 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
. Приклад тут .