le profilage d'une méthode d'une classe en Python en utilisant cprofile?
Question
je voudrais profiler un procédé d'une fonction dans le python, en utilisant Cprofile. J'ai essayé ce qui suit:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
Mais cela ne fonctionne pas. Comment puis-je appeler un self.method avec "run"?
La solution
Utilisez le profilehooks décorateur
Autres conseils
EDIT:. Désolé, n'a pas réalisé que l'appel de profil était une méthode de classe
run
essaie juste de exec
la chaîne que vous passez. Si self
n'est pas lié à quoi que ce soit dans le cadre de la profileur que vous utilisez, vous ne pouvez pas l'utiliser dans run
! Utilisez la méthode runctx
pour passer les variables locales et globales dans le cadre de l'appel à la 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
Je ne recommande pas de profilage d'une seule routine, parce que cela implique de savoir à l'avance, il y a un problème.
Un aspect fondamental des problèmes de performance est qu'ils sont sournoises. Ils ne sont pas où vous pensez qu'ils sont, parce que si elles étaient vous auriez déjà résolu.
Il est préférable d'exécuter tout le programme avec une charge de travail réaliste et laisser la technique de profilage vous dire où sont les problèmes.
Voici un exemple où le profilage trouve la problème, et il est pas là où prévu.
Si votre fonction sous la valeur de retour de profil (s), vous devez changer l'excellente réponse de @katrielalex légèrement:
... profile.runctx('val = self.baz()', globals(), locals())
... print locals()['val']