Профилирование в Python: Кто вызвал функцию?

Смотрите, я быстро попробовал, добавил точку останова и получил обратный вызов во фрагменте.

enter image description here использовать контекст

 val builder = android.support.v7.app.AlertDialog.Builder(context)

вместо активности

 val builder = android.support.v7.app.AlertDialog.Builder(activity)

48
задан Ram Rachum 9 May 2009 в 06:24
поделиться

6 ответов

Это может не дать прямого ответа на ваш вопрос, но определенно поможет. Если использовать профилировщик с опцией --sort cumulative, он сортирует функции по совокупному времени. Это полезно для обнаружения не только тяжелых функций, но и функций, которые их вызывают.

python -m cProfile --sort cumulative myScript.py

Существует обходной путь для получения функции вызывающего абонента:

import inspect
print inspect.getframeinfo(inspect.currentframe().f_back)[2]

Вы можете добавить столько f_back, сколько хотите, на случай, если вам нужен вызывающий вызывающий объект и т. Д. Если вы хотите подсчитать частые вызовы, вы можете сделать это:

record = {}

caller = inspect.getframeinfo(inspect.currentframe().f_back)[2]
record[caller] = record.get(caller, 0) + 1

Затем распечатать их в порядке частоты:

print sorted(record.items(), key=lambda a: a[1])
34
ответ дан 7 November 2019 в 12:06
поделиться

Я сам не использовал cProfile, но большинство профилировщиков звонят вам иерархия.
Погуглив, я нашел эти слайды о cProfile. Может, это поможет. Страница 6 выглядит так, будто cProfile предоставляет иерархию.

1
ответ дан 7 November 2019 в 12:06
поделиться

Я почти всегда просматриваю вывод модуля cProfile, используя Gprof2dot , в основном он преобразует выходные данные в график graphvis (файл .dot ), например:

example gprof2dot output

Это позволяет очень легко определить, какая функция самая медленная и какая функция [ы] вызвала ее.

Использование:

python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
105
ответ дан 7 November 2019 в 12:06
поделиться

inspect.stack () даст вам текущий стек вызывающего абонента.

10
ответ дан 7 November 2019 в 12:06
поделиться

Возможно, вам стоит взглянуть на пикалграф .

3
ответ дан 7 November 2019 в 12:06
поделиться

Извините, я не знаком с Python, но есть общий метод , который работает, предполагая, что вы можете вручную прервать выполнение в случайное время.

Просто сделайте это. , и отобразить стек вызовов. Он с большой долей вероятности скажет вам то, что вы хотите знать. Если вы хотите быть более уверенными, просто сделайте это несколько раз.

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

ПРИМЕЧАНИЕ: Этот процесс больше похож на диагностику, чем на измерение. Предположим, что плохой вызов тратит 90% времени. Тогда каждый раз, когда вы его останавливаете, вероятность того, что неверный оператор вызова находится прямо там в стеке вызовов, чтобы вы могли видеть, составляет 90%, и вы увидите, что это плохо. Однако, если вы хотите точно измерить потери, это другая проблема. Для этого вам понадобится намного больше образцов, чтобы увидеть, какой% из них содержит этот вызов. Или, в качестве альтернативы, просто исправьте виновный вызов, измерьте ускорение, и это точно скажет вам, какие были потери.

0
ответ дан 7 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

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