Perfilar un código de Python

Fariba Laiq 30 enero 2023
  1. Use cProfile para perfilar un código de Python
  2. Use SnakeViz para visualizar los resultados del perfil en Python
Perfilar un código de Python

La creación de perfiles es una técnica que muestra las estadísticas sobre cuánto tiempo necesita ejecutarse un script y con qué frecuencia se ejecuta. A través de esto, podemos entender qué parte del código necesita optimizarse y hacer que el programa sea eficiente.

Use cProfile para perfilar un código de Python

cProfile es un módulo incorporado en Python que mide el tiempo de ejecución de un programa y también muestra con qué frecuencia se llama a un método. Para perfilar un código de Python, escribiremos el código o el nombre del método como un argumento de cadena en la llamada al método run().

Junto con el tiempo total de ejecución del programa, también muestra cuánto tiempo tarda en ejecutarse un método en particular.

En el siguiente código, hemos escrito una operación de comparación simple como una cadena en la llamada al método run(). La salida muestra todas las estadísticas de ese código.

Código de ejemplo:

import cProfile

cProfile.run("0 < 1")

Producción :

3 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Ahora, escribamos un código que tomó mucho tiempo con muchas llamadas a métodos en el back-end. En el siguiente código, hemos creado un método que contiene bucles anidados que agregan los números a una lista.

Pasaremos su nombre al método run() para perfilar este método. La salida muestra todas las estadísticas sobre este código.

Código de ejemplo:

import cProfile


def func():
    num = []
    for i in range(1, 100):
        for j in range(1, 100):
            num.append(j)


cProfile.run("func()")

Producción :

9805 function calls in 0.009 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.006    0.006    0.009    0.009 <ipython-input-3-d9419f0448d8>:2(func)
        1    0.000    0.000    0.009    0.009 <string>:1(<module>)
        1    0.000    0.000    0.009    0.009 {built-in method builtins.exec}
     9801    0.003    0.000    0.003    0.000 {method 'append' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Use SnakeViz para visualizar los resultados del perfil en Python

SnakeViz es una herramienta basada en la web para la visualización de perfiles. Podemos instalarlo y usarlo fácilmente.

pip install snakeviz

Supongamos que queremos perfilar y visualizar los resultados del siguiente código. Tenemos que guardar el código en un archivo py en el entorno de Python.

Tenemos tres funciones, cada una de las cuales contiene un bucle que se ejecuta 1000 veces y realiza algunas operaciones aritméticas.

Código de ejemplo:

def func():
    a = 1
    b = 2
    for i in range(1, 1000):
        a += b


def func2():
    a = 1
    b = 2
    for i in range(1, 1000):
        a -= b


def func3():
    a = 1
    b = 2
    for i in range(1, 1000):
        a *= b


func()
func2()
func3()

Usaremos los siguientes comandos para perfilar y visualizar los resultados.

python -m cProfile -o temp.dat My_Script.py
snakeviz temp.dat

Producción:

carámbano viz de serpiente

Resplandor solar de viz de serpiente

Icicle (predeterminado) y Sunburst son los dos modos de visualización que ofrece SnakeViz. En el caso de Icicle, el ancho de un rectángulo describe la cantidad de tiempo empleado en una función.

La extensión angular del arco representa el tiempo de ejecución si cambiamos a Sunburst. Usando la opción Style, podemos cambiar los dos estilos.

Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn

Artículo relacionado - Python Profile