¿Cómo puedo perfilar un método de un objeto llamado dentro de una función? Estoy usando la magia %lprun en un cuaderno jupyter. Consulte el siguiente archivo de ejemplo ex.py :
class foo(): def __init__(self, a=0, n=1): self.a=a self.n=n def compute(self): result = 0 for i in range(self.n): result += self.a return result def my_func(): a = 1 n = 1000 my_foo = foo(a, n) result = my_foo.compute() print(result) Luego, desde mi cuaderno jupyter, puedo perfilar my_func :
from ex import my_func %lprun -f my_func my_func() pero no puedo perfilar mi método de compute :
from ex import my_func %lprun -f my_foo.compute my_func() ¿Es posible lo que quiero? ¿Cómo tendría que completar el método de clase en el argumento -f para que funcione?
De acuerdo con la documentación , "cProfile solo llama a funciones explícitas, no a métodos especiales llamados debido a la sintaxis", ... por lo que debería funcionar.
Una pregunta (quizás) relacionada que encontré está aquí .
TL; DR: Use foo en %lprun -f foo.compute my_func() , no my_foo como en su ejemplo.
Dado el ejemplo actual, puede perfilar su clase y método como tal:
%load_ext line_profiler
Perfila tu función en la que llamas a tu clase: %lprun -f my_func my_func() , que devuelve:
Timer unit: 1e-06 s Total time: 0.000363 s File: <ipython-input-111-dedac733c95b> Function: my_func at line 12 Line # Hits Time Per Hit % Time Line Contents ============================================================== 12 def my_func(): 13 1 2.0 2.0 0.6 a = 1 14 1 1.0 1.0 0.3 n = 1000 15 1 4.0 4.0 1.1 my_foo = foo(a, n) 16 1 278.0 278.0 76.6 result = my_foo.compute() 17 1 78.0 78.0 21.5 print(result)my_foo.compute() . my_foo es una instancia de la clase foo , por lo que realiza una llamada de generador de perfiles más específica %lprun -f foo.compute my_func() , que devuelve: Timer unit: 1e-06 s Total time: 0.001566 s File: <ipython-input-12-e96be9cf3108> Function: compute at line 6 Line # Hits Time Per Hit % Time Line Contents ============================================================== 6 def compute(self): 7 1 3.0 3.0 0.2 result = 0 8 1001 765.0 0.8 48.9 for i in range(self.n): 9 1000 797.0 0.8 50.9 result += self.a 10 1 1.0 1.0 0.1 return result