¿Cómo puedo hacer que %lprun funcione en una función anidada en Python?
En Jupyter Notebook, estoy tratando de usar %lprun en funciones anidadas pero no tengo éxito.
El siguiente código, en una celda del notebook:
def outerfoo():
def innerfoo():
print("Hello World")
print("Good Bye")
innerfoo()
%lprun -f outerfoo().innerfoo outerfoo()
produce los mensajes (Hello World y Good Bye) pero luego tengo este error:
UsageError: No se pudo encontrar la función ‘outerfoo().innerfoo’.
AttributeError: El objeto de tipo ‘NoneType’ no tiene el atributo ‘innerfoo’.
Y este otro:
def outerfoo():
def innerfoo():
print("Hello World")
print("Good Bye")
%lprun -f innerfoo innerfoo()
outerfoo()
no imprime los mensajes y brinda este error:
UsageError: No se pudo encontrar la función ‘innerfoo’.
NameError: El nombre ‘innerfoo’ no está definido.
¿Cómo es posible perfilar innerfoo?
davy.ai
Para perfilar una función anidada como
innerfoo
utilizando%lprun
en Jupyter Notebook, una forma es mover el decorador de perfilar a la función externaouterfoo
. Esto permitirá que el perfilador capture el tiempo de ejecución de la función internainnerfoo
. El código modificado podría verse así:De esta manera, no es necesario utilizar el comando
%lprun
, ya que se utiliza el decorador@profile
en su lugar. El decorador@profile
es parte del paqueteline_profiler
y se utiliza para perfilar funciones individuales. Es importante tener en cuenta que se debe instalar el paqueteline_profiler
en el entorno primero utilizando!pip install line_profiler
.Además, si deseas perfilar cada línea de la función anidada
innerfoo
, podrías modificar el código de la siguiente manera:Aquí, el comando
%lprun
se utiliza después de llamar ainnerfoo()
enouterfoo()
. Esto mostrará el tiempo de ejecución línea por línea deinnerfoo()
y proporcionará información sobre qué líneas pueden estar tomando más tiempo en ejecutarse.