Question profiler une méthode d'une classe en Python en utilisant cProfile?


Je voudrais profiler une méthode d'une fonction en Python, en utilisant cProfile. J'ai essayé ce qui suit:

import cProfile as profile

# inside class method...
profile.run("self.myMethod()", "output_file")

mais ça ne marche pas. Comment puis-je appeler une méthode auto avec "run"?

Merci.


29
2017-12-20 18:14


origine


Réponses:


Utilisez le décorateur de profils

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


22
2017-12-20 18:21



EDIT: Désolé, n'a pas réalisé que l'appel de profil était dans une méthode de classe.

run essaie juste de exec la chaîne que vous passez. Si self n'est lié à rien dans la portée du profileur que vous utilisez, vous ne pouvez pas l'utiliser dans run! Utilisez le runctx méthode pour passer les variables locales et globales dans la portée de l'appel au profileur:

>>> 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}

Notez la dernière ligne: time.sleep est ce qui prend le temps.


38
2017-12-20 18:20



Je ne recommanderais pas le profilage d’une seule routine, car cela implique de savoir à l’avance qu’il ya un problème.

Un aspect fondamental des problèmes de performance est qu'ils sont sournois. Ils ne sont pas là où vous pensez qu’ils sont, car s’ils l’étaient vous les auriez déjà résolus.

Il est préférable d'exécuter l'ensemble du programme avec une charge de travail réaliste et de laisser la technique de profilage vous indiquer où sont les problèmes.

Voici un exemple où le profilage trouve le problème, et ce n'est pas le cas.


2
2017-12-20 18:45



Si votre fonction sous le profil retourne une valeur (s), vous devez changer la réponse excellente de @katrielalex légèrement:

...             profile.runctx('val = self.baz()', globals(), locals())
...             print locals()['val']

1
2017-10-17 22:42