К сожалению, я не знаком с Python, но есть general method, который работает, если вы можете вручную прервать выполнение в случайное время.
Просто сделайте это и отобразите стек вызовов. Он расскажет вам, с большой вероятностью, то, что вы хотите знать. Если вы хотите быть более уверенным, просто делайте это несколько раз.
Это работает, потому что виновный звонящий должен находиться в стеке вызовов за долю времени, потраченного впустую, что в течение этого времени предоставляет его прерываниям, независимо от того, распространяется ли оно на многие короткие вызовы или на несколько длинные.
ПРИМЕЧАНИЕ. Этот процесс больше похож на диагностику, чем на измерение. Предположим, что плохой вызов тратит 90% времени. Тогда каждый раз, когда вы его останавливаете, вероятность 90% заключается в том, что оператор плохого вызова находится прямо в стеке вызовов, чтобы вы могли видеть, и вы увидите, что это плохо.Однако, если вы хотите точно измерить потерю, это другая проблема. Для этого вам понадобится намного больше образцов, чтобы узнать, в каком% из них содержится этот вызов. Или, альтернативно, просто исправьте виновный звонок, ускорьте часы, и это точно скажет вам, что такое потеря.
Если вы сохраните результаты cProfile в файл и используете модуль 'pstats' для загрузки профиля, вы можете напрямую запросить вызывающих абонентов тяжелой функции:' loaded_stats_object.print_callers ('heavy_function') ' –