mit cProfile eine Methode einer Klasse in Python Profilierungs?
Frage
Ich möchte eine Methode einer Funktion in Python profilieren, cProfile verwenden. Ich habe versucht, die folgenden:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
Aber es funktioniert nicht. Wie kann ich einen self.method mit "run" nennen?
Lösung
Mit dem profilehooks Dekorateur
Andere Tipps
EDIT:. Es ist nicht klar, dass das Profil Anruf war in eine Klassenmethode
run
versucht, nur die Zeichenfolge Sie es passieren exec
. Wenn self
nicht alles im Rahmen des Profilers gebunden ist, das Sie verwenden, können Sie es nicht in run
verwenden! Verwenden Sie die runctx
Methode in den lokalen und globalen Variablen übergeben im Rahmen des Anrufs an die Profiler:
>>> import time
>>> import cProfile as profile
>>> class Foo(object):
... def bar(self):
... profile.runctx('self.baz()', globals(), locals())
...
... def baz(self):
... time.sleep(1)
... print 'slept'
... time.sleep(2)
...
>>> foo = Foo()
>>> foo.bar()
slept
5 function calls in 2.999 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 2.999 2.999 <stdin>:5(baz)
1 0.000 0.000 2.999 2.999 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 2.999 1.499 2.999 1.499 {time.sleep}
Beachten Sie die letzte Zeile. time.sleep
ist es, was die Zeit ist die Aufnahme
Ich würde nicht empfehlen, eine einzige Routine Profilieren, denn das im Voraus zu wissen, bedeutet, dass es ein Problem gibt.
Ein wesentlicher Aspekt von Performance-Problemen sind sie sind hinterhältig. Sie sind nicht da, wo Sie denken, sie sind, denn wenn sie wären, würden Sie sie schon gelöst haben.
Es ist besser, das ganze Programm mit einer realistischen Arbeitsbelastung laufen und die Profilierung Technik können Ihnen sagen, wo die Probleme sind.
Hier ist ein Beispiel, wo Profilierung findet die Problem, und es ist nicht, wo erwartet wird.
Wenn Ihre Funktion unter Profil kehrt Wert (e), müssen Sie von @katrielalex die ausgezeichneten Antwort ändern, leicht:
... profile.runctx('val = self.baz()', globals(), locals())
... print locals()['val']