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"?

Était-ce utile?

La solution

Utilisez le profilehooks décorateur

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

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']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top