otra - ¿Perfilando un método de una clase en Python usando cProfile?
llamar metodo de otra clase python (4)
Me gustaría perfilar un método de una función en Python, usando cProfile. Intenté lo siguiente:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
Pero no funciona. ¿Cómo puedo llamarme a uno mismo con "correr"?
EDITAR: Lo siento, no me di cuenta de que la llamada de perfil estaba en un método de clase.
run
solo intenta run
la cadena que se pasa. Si self
no está vinculado a nada en el alcance del generador de perfiles que está utilizando, ¡no puede usarlo en la run
! Use el método runctx
para pasar las variables locales y globales en el alcance de la llamada al generador de perfiles:
>>> 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}
Observe la última línea: time.sleep
es lo que toma el tiempo.
No recomendaría crear perfiles de una sola rutina, porque eso implica saber de antemano que hay un problema allí.
Un aspecto fundamental de los problemas de rendimiento es que son astutos. No están donde crees que están, porque si estuvieran, ya los habrías resuelto.
Es mejor ejecutar todo el programa con una carga de trabajo realista y dejar que la técnica de creación de perfiles le indique dónde están los problemas.
Aquí hay un ejemplo donde la creación de perfiles encuentra el problema, y no está donde se esperaba.
Si su función en el perfil devuelve valor (es), necesita cambiar ligeramente la respuesta excelente de @katrielalex:
... profile.runctx(''val = self.baz()'', globals(), locals())
... print locals()[''val'']
Usa el decorador de perfiles.