Profiler un code Python

Fariba Laiq 30 janvier 2023
  1. Utiliser cProfile pour profiler un code Python
  2. Utilisez SnakeViz pour visualiser les résultats du profil en Python
Profiler un code Python

Le profilage est une technique qui affiche les statistiques sur le temps nécessaire à un script pour s’exécuter et sur sa fréquence d’exécution. Grâce à cela, nous pouvons comprendre quelle partie du code doit être optimisée et rendre le programme efficace.

Utiliser cProfile pour profiler un code Python

cProfile est un module intégré à Python qui mesure le temps d’exécution d’un programme et montre également à quelle fréquence une méthode est appelée. Pour profiler un code Python, nous écrirons le code ou le nom de la méthode comme argument de chaîne dans l’appel de la méthode run().

Outre le temps d’exécution total du programme, il indique également le temps nécessaire à l’exécution d’une méthode particulière.

Dans le code suivant, nous avons écrit une opération de comparaison simple sous forme de chaîne dans l’appel de la méthode run(). La sortie affiche toutes les statistiques de ce code.

Exemple de code :

import cProfile

cProfile.run("0 < 1")

Production:

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}

Maintenant, écrivons un code qui a pris beaucoup de temps avec de nombreux appels de méthode dans le backend. Dans le code suivant, nous avons créé une méthode contenant des boucles imbriquées qui ajoutent les nombres à une liste.

Nous allons passer son nom à la méthode run() pour profiler cette méthode. La sortie affiche toutes les statistiques sur ce code.

Exemple de code :

import cProfile


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


cProfile.run("func()")

Production:

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}

Utilisez SnakeViz pour visualiser les résultats du profil en Python

SnakeViz est un outil Web de visualisation de profil. Nous pouvons l’installer et l’utiliser facilement.

pip install snakeviz

Supposons que nous voulions profiler et visualiser les résultats du code suivant. Nous devons sauvegarder le code dans un fichier py dans l’environnement de Python.

Nous avons trois fonctions, chacune contenant une boucle qui s’exécute 1000 fois et effectue des opérations arithmétiques.

Exemple de code :

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()

Nous utiliserons les commandes suivantes pour profiler et visualiser les résultats.

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

Production:

Glaçon SnakeViz

SnakeViz Sunburst

Icicle (par défaut) et Sunburst sont les deux modes de visualisation proposés par SnakeViz. Dans le cas d’Icicle, la largeur d’un rectangle décrit le temps passé dans une fonction.

L’étendue angulaire de l’arc représente le temps d’exécution si on passe en Sunburst. En utilisant l’option Style, nous pouvons changer les deux styles.

Auteur: Fariba Laiq
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