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?

War es hilfreich?

Lösung

Mit dem profilehooks Dekorateur

http://pypi.python.org/pypi/profilehooks

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']
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top