Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Principes Fondamentaux du Chronométrage et du Benchmarking | Compréhension et Mesure des Performances
Techniques d’Optimisation en Python

bookPrincipes Fondamentaux du Chronométrage et du Benchmarking

Puisque l’analyse de la complexité temporelle n’est pas au centre de ce cours, nous nous concentrerons sur des méthodes empiriques (pratiques) pour mesurer les performances réelles du code. L’une des façons les plus simples de mesurer la performance d’un extrait de code consiste à utiliser la fonction intégrée time.time().

Cette fonction retourne l’heure actuelle en secondes depuis l’époque (le point de référence du système pour le temps). En appelant time.time() avant et après un segment de code, il est possible de calculer la différence pour déterminer le temps d’exécution.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Bien que l’utilisation de time.time() soit simple et efficace pour des estimations approximatives, cette méthode présente plusieurs limites :

  • Faible résolution : la précision de time.time() peut varier selon le système d’exploitation, ce qui entraîne des résultats imprécis pour les opérations courtes ;
  • Surcharge : elle inclut d’autres processus système s’exécutant en arrière-plan, ce qui peut fausser la mesure ;
  • Pas de répétition : pour obtenir des mesures plus précises, il est souvent nécessaire d’exécuter plusieurs fois le même code afin d’obtenir une moyenne, ce que time.time() ne gère pas automatiquement.

Avantages de l'utilisation de timeit

Le module timeit est un outil plus avancé conçu pour surmonter les limitations de time.time() et fournir un moyen fiable de mesurer le temps d'exécution de petits extraits de code, souvent appelé micro-benchmarking.

Les principaux avantages de timeit sont :

  • Haute précision : timeit utilise time.perf_counter() en interne, un minuteur haute résolution qui inclut le temps passé en veille et en attente d'E/S, ce qui le rend plus précis pour les intervalles courts que time.time() ;

  • Répétition automatique : timeit exécute automatiquement le code plusieurs fois et calcule le temps d'exécution moyen. Cela permet d'atténuer les effets des processus d'arrière-plan, offrant une mesure plus fiable des performances du code ;

  • Surcharge minimale : timeit est conçu pour s'exécuter dans un environnement propre, désactivant temporairement le ramasse-miettes afin de garantir que les mesures se concentrent sur le code testé sans interférence des opérations de gestion de la mémoire.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

Dans cet exemple, timeit.timeit() exécute le code spécifié sous forme de chaîne (variable code_snippet) 30 fois (défini par le paramètre number) et retourne le temps d'exécution total pour les 30 exécutions. En divisant le temps total par le nombre d'itérations (30), il est possible de calculer le temps d'exécution moyen pour une seule exécution.

Choix du nombre d’itérations

Le choix du nombre d’itérations dépend de la complexité du code que vous évaluez et de la précision souhaitée dans les résultats de mesure. Exécuter votre code avec différents nombres d’itérations permet d’évaluer la stabilité des résultats ; si les temps d’exécution sont constants, vous avez probablement trouvé un nombre d’itérations optimal.

Pour des extraits de code très rapides (millisecondes ou moins), viser 1000 itérations ou plus permet d’obtenir des moyennes fiables. Pour du code de durée modérée (quelques millisecondes à quelques secondes), 100 à 500 itérations suffisent généralement. Pour du code plus long à exécuter (plusieurs secondes ou plus), 10 à 50 itérations offrent en général un bon compromis entre précision et temps passé à mesurer les performances.

1. Quelle fonction offre une haute précision et exécute automatiquement le code plusieurs fois pour calculer un temps d’exécution moyen ?

2. Pourquoi l’utilisation de time.time() pour mesurer les performances peut-elle être moins fiable que timeit.timeit() ?

question mark

Quelle fonction offre une haute précision et exécute automatiquement le code plusieurs fois pour calculer un temps d’exécution moyen ?

Select the correct answer

question mark

Pourquoi l’utilisation de time.time() pour mesurer les performances peut-elle être moins fiable que timeit.timeit() ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 2

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

Can you explain how to use the timeit module with functions instead of code strings?

What are some best practices for benchmarking code performance in Python?

Can you provide more examples of using timeit for different types of code?

Awesome!

Completion rate improved to 7.69

bookPrincipes Fondamentaux du Chronométrage et du Benchmarking

Glissez pour afficher le menu

Puisque l’analyse de la complexité temporelle n’est pas au centre de ce cours, nous nous concentrerons sur des méthodes empiriques (pratiques) pour mesurer les performances réelles du code. L’une des façons les plus simples de mesurer la performance d’un extrait de code consiste à utiliser la fonction intégrée time.time().

Cette fonction retourne l’heure actuelle en secondes depuis l’époque (le point de référence du système pour le temps). En appelant time.time() avant et après un segment de code, il est possible de calculer la différence pour déterminer le temps d’exécution.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Bien que l’utilisation de time.time() soit simple et efficace pour des estimations approximatives, cette méthode présente plusieurs limites :

  • Faible résolution : la précision de time.time() peut varier selon le système d’exploitation, ce qui entraîne des résultats imprécis pour les opérations courtes ;
  • Surcharge : elle inclut d’autres processus système s’exécutant en arrière-plan, ce qui peut fausser la mesure ;
  • Pas de répétition : pour obtenir des mesures plus précises, il est souvent nécessaire d’exécuter plusieurs fois le même code afin d’obtenir une moyenne, ce que time.time() ne gère pas automatiquement.

Avantages de l'utilisation de timeit

Le module timeit est un outil plus avancé conçu pour surmonter les limitations de time.time() et fournir un moyen fiable de mesurer le temps d'exécution de petits extraits de code, souvent appelé micro-benchmarking.

Les principaux avantages de timeit sont :

  • Haute précision : timeit utilise time.perf_counter() en interne, un minuteur haute résolution qui inclut le temps passé en veille et en attente d'E/S, ce qui le rend plus précis pour les intervalles courts que time.time() ;

  • Répétition automatique : timeit exécute automatiquement le code plusieurs fois et calcule le temps d'exécution moyen. Cela permet d'atténuer les effets des processus d'arrière-plan, offrant une mesure plus fiable des performances du code ;

  • Surcharge minimale : timeit est conçu pour s'exécuter dans un environnement propre, désactivant temporairement le ramasse-miettes afin de garantir que les mesures se concentrent sur le code testé sans interférence des opérations de gestion de la mémoire.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

Dans cet exemple, timeit.timeit() exécute le code spécifié sous forme de chaîne (variable code_snippet) 30 fois (défini par le paramètre number) et retourne le temps d'exécution total pour les 30 exécutions. En divisant le temps total par le nombre d'itérations (30), il est possible de calculer le temps d'exécution moyen pour une seule exécution.

Choix du nombre d’itérations

Le choix du nombre d’itérations dépend de la complexité du code que vous évaluez et de la précision souhaitée dans les résultats de mesure. Exécuter votre code avec différents nombres d’itérations permet d’évaluer la stabilité des résultats ; si les temps d’exécution sont constants, vous avez probablement trouvé un nombre d’itérations optimal.

Pour des extraits de code très rapides (millisecondes ou moins), viser 1000 itérations ou plus permet d’obtenir des moyennes fiables. Pour du code de durée modérée (quelques millisecondes à quelques secondes), 100 à 500 itérations suffisent généralement. Pour du code plus long à exécuter (plusieurs secondes ou plus), 10 à 50 itérations offrent en général un bon compromis entre précision et temps passé à mesurer les performances.

1. Quelle fonction offre une haute précision et exécute automatiquement le code plusieurs fois pour calculer un temps d’exécution moyen ?

2. Pourquoi l’utilisation de time.time() pour mesurer les performances peut-elle être moins fiable que timeit.timeit() ?

question mark

Quelle fonction offre une haute précision et exécute automatiquement le code plusieurs fois pour calculer un temps d’exécution moyen ?

Select the correct answer

question mark

Pourquoi l’utilisation de time.time() pour mesurer les performances peut-elle être moins fiable que timeit.timeit() ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 2
some-alt