Leider habe ich mit Python nicht vertraut bin, aber es gibt ein general method, das funktioniert, vorausgesetzt, Sie manuell die Ausführung zu einem beliebigen Zeitpunkt unterbrechen können.
Tun Sie es einfach und zeigen Sie den Aufruf-Stack an. Es wird Ihnen mit hoher Wahrscheinlichkeit sagen, was Sie wissen wollen. Wenn Sie sicherer sein wollen, tun Sie es einfach mehrmals.
Es funktioniert, weil der schuldige Anrufer für den Bruchteil der Zeit, die verschwendet wird, auf dem Anruf-Stack sein muss, was es für die meiste Zeit Ihren Interrupts aussetzt, ob es über viele kurze Anrufe verteilt ist oder nur wenige langwierige.
HINWEIS: Dieser Prozess ähnelt mehr der Diagnose als der Messung. Nehmen wir an, dass ein schlechter Anruf 90% der Zeit verschwendet. Dann ist jedes Mal, wenn Sie es anhalten, die Wahrscheinlichkeit 90%, dass die schlechte Call-Anweisung genau dort auf dem Call-Stack für Sie zu sehen ist, und Sie werden sehen können, dass es schlecht ist.Wenn Sie jedoch die Verschwendung genau messen möchten, ist das ein anderes Problem. Dazu benötigen Sie viel mehr Samples, um zu sehen, wie viele% dieser Aufrufe enthalten sind. Oder alternativ, einfach den schuldigen Ruf beheben, die Beschleunigung beschleunigen, und das wird dir genau sagen, was die Verschwendung war.
Wenn Sie die Ergebnisse von cProfile in eine Datei speichern und das Modul 'pstats' verwenden, um das Profil zu laden, können Sie direkt nach den Aufrufern der schweren Funktion fragen:' loaded_stats_object.print_callers ('heavy_function') ' –