Mesure des Performances des Fonctions
Bien que la mesure de fragments de code sous forme de chaînes puisse parfois suffire, cette méthode manque de flexibilité. L'utilisation de timeit avec des fonctions offre un moyen plus efficace d'évaluer les performances, et les décorateurs simplifient la mesure des performances de plusieurs fonctions de manière claire et modulaire.
Utilisation de timeit avec des fonctions
timeit permet de mesurer directement les performances des fonctions en passant un callable (c'est-à-dire une fonction) au lieu d'une chaîne de caractères. Cette méthode est plus flexible et lisible que l'utilisation de chaînes, en particulier lorsque l'on souhaite évaluer des fonctions complexes.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Nous passons generate_squares comme fonction (appelable) à chronométrer en utilisant timeit.timeit(). Comme précédemment, le paramètre number spécifie le nombre d'exécutions de la fonction (15 fois). Le temps d'exécution moyen est ensuite calculé en divisant le temps total par le nombre d'exécutions.
Cette méthode est plus propre et plus efficace pour l'évaluation des performances de fonctions réelles, et elle évite la surcharge liée à l'évaluation de code à partir d'une chaîne de caractères.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Oups, nous avons obtenu l’erreur suivante : NameError: name 'np' is not defined. Cette erreur se produit parce que timeit.timeit() exécute le code de manière isolée, il n’a donc pas accès à numpy à moins que vous ne l’importiez explicitement via l’argument setup :
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Utiliser des fonctions est plus propre, réduit les erreurs et ne nécessite pas de gérer les imports externes via une chaîne setup.
Amélioration de la mesure des performances avec les décorateurs
Appliquer la même logique de chronométrage à plusieurs fonctions est une pratique courante, et un décorateur offre une méthode claire et efficace pour l’implémenter sans dupliquer le code.
À chaque appel de fonction, l’exécution se déroule normalement, mais avec un benchmarking intégré de manière transparente. Les décorateurs présentent plusieurs avantages : ils améliorent la réutilisabilité en appliquant la même logique à plusieurs fonctions, renforcent la clarté en séparant la logique de chronométrage de la fonctionnalité principale, et permettent la personnalisation, comme l’ajustement du nombre d’itérations ou l’ajout de métriques supplémentaires pour l’analyse des performances.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Désormais, chaque fois qu’une fonction est décorée avec @timeit_decorator, ses performances seront mesurées automatiquement et les résultats seront affichés.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain how decorators work in Python?
What are some other use cases for decorators besides timing functions?
How can I customize the timeit_decorator for different functions?
Awesome!
Completion rate improved to 7.69
Mesure des Performances des Fonctions
Glissez pour afficher le menu
Bien que la mesure de fragments de code sous forme de chaînes puisse parfois suffire, cette méthode manque de flexibilité. L'utilisation de timeit avec des fonctions offre un moyen plus efficace d'évaluer les performances, et les décorateurs simplifient la mesure des performances de plusieurs fonctions de manière claire et modulaire.
Utilisation de timeit avec des fonctions
timeit permet de mesurer directement les performances des fonctions en passant un callable (c'est-à-dire une fonction) au lieu d'une chaîne de caractères. Cette méthode est plus flexible et lisible que l'utilisation de chaînes, en particulier lorsque l'on souhaite évaluer des fonctions complexes.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Nous passons generate_squares comme fonction (appelable) à chronométrer en utilisant timeit.timeit(). Comme précédemment, le paramètre number spécifie le nombre d'exécutions de la fonction (15 fois). Le temps d'exécution moyen est ensuite calculé en divisant le temps total par le nombre d'exécutions.
Cette méthode est plus propre et plus efficace pour l'évaluation des performances de fonctions réelles, et elle évite la surcharge liée à l'évaluation de code à partir d'une chaîne de caractères.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Oups, nous avons obtenu l’erreur suivante : NameError: name 'np' is not defined. Cette erreur se produit parce que timeit.timeit() exécute le code de manière isolée, il n’a donc pas accès à numpy à moins que vous ne l’importiez explicitement via l’argument setup :
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Utiliser des fonctions est plus propre, réduit les erreurs et ne nécessite pas de gérer les imports externes via une chaîne setup.
Amélioration de la mesure des performances avec les décorateurs
Appliquer la même logique de chronométrage à plusieurs fonctions est une pratique courante, et un décorateur offre une méthode claire et efficace pour l’implémenter sans dupliquer le code.
À chaque appel de fonction, l’exécution se déroule normalement, mais avec un benchmarking intégré de manière transparente. Les décorateurs présentent plusieurs avantages : ils améliorent la réutilisabilité en appliquant la même logique à plusieurs fonctions, renforcent la clarté en séparant la logique de chronométrage de la fonctionnalité principale, et permettent la personnalisation, comme l’ajustement du nombre d’itérations ou l’ajout de métriques supplémentaires pour l’analyse des performances.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Désormais, chaque fois qu’une fonction est décorée avec @timeit_decorator, ses performances seront mesurées automatiquement et les résultats seront affichés.
Merci pour vos commentaires !