es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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 externa outerfoo. Esto permitirá que el perfilador capture el tiempo de ejecución de la función interna innerfoo. El código modificado podría verse así:

    %load_ext line_profiler
    
    def outerfoo():
        @profile
        def innerfoo():
            print("Hola Mundo")
            print("Adiós")
        innerfoo()
    
    outerfoo()
    

    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 paquete line_profiler y se utiliza para perfilar funciones individuales. Es importante tener en cuenta que se debe instalar el paquete line_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:

    %load_ext line_profiler
    
    def outerfoo():
        def innerfoo():
            print("Hola Mundo")
            print("Adiós")
        innerfoo()
    
        %lprun -f innerfoo innerfoo()
    
    outerfoo()
    

    Aquí, el comando %lprun se utiliza después de llamar a innerfoo() en outerfoo(). Esto mostrará el tiempo de ejecución línea por línea de innerfoo() y proporcionará información sobre qué líneas pueden estar tomando más tiempo en ejecutarse.

Comments are closed.