Je veux créer une fonction python pour tester le temps passé dans chaque fonction et imprimer son nom avec son heure, comment je peux imprimer le nom de la fonction et s'il y a une autre façon de le faire, veuillez me le dire
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
pour la mesure. Ce n'est pas parfait, mais cela bat de loin votre coup et c'est beaucoup plus facile à utilisertimeit
que de concocter quelque chose de mieux vous-même.Réponses:
Tout d'abord, je suggère fortement d'utiliser un profileur ou au moins utiliser timeit .
Cependant, si vous vouliez écrire votre propre méthode de chronométrage strictement pour apprendre, voici un endroit pour commencer à utiliser un décorateur.
Python 2:
Et l'utilisation est très simple, il suffit d'utiliser le décorateur @timing:
Python 3:
Notez que j'appelle
f.func_name
pour obtenir le nom de la fonction sous forme de chaîne (en Python 2) ouf.__name__
en Python 3.la source
Après avoir joué avec le
timeit
module, je n'aime pas son interface, qui n'est pas si élégante comparée aux deux méthodes suivantes.Le code suivant est en Python 3.
La méthode décoratrice
C'est presque la même chose avec la méthode de @ Mike. Ici, j'ajoute
kwargs
etfunctools
j'emballe pour l'améliorer.La méthode du gestionnaire de contexte
Par exemple, vous pouvez l'utiliser comme:
Et le code dans le
with
bloc sera chronométré.Conclusion
En utilisant la première méthode, vous pouvez facilement commenter le décorateur pour obtenir le code normal. Cependant, il ne peut chronométrer qu'une fonction. Si vous avez une partie de code dont vous ne savez pas quoi faire pour en faire une fonction, vous pouvez choisir la deuxième méthode.
Par exemple, maintenant vous avez
Maintenant vous voulez chronométrer le
bigImage = ...
ligne. Si vous le changez en fonction, ce sera:Ça n'a pas l'air génial ... Et si vous êtes en Python 2, qui n'a pas de
nonlocal
mot-clé.Au lieu de cela, utiliser la deuxième méthode convient très bien ici:
la source
timeit
interface et utiliser lawraps()
fonction dufunctools
module. Je veux dire que tout ce code supplémentaire n'est pas nécessaire.import functools
Je ne vois pas quel est le problème avec le
timeit
module. C'est probablement la manière la plus simple de le faire.Il est également possible d'envoyer des arguments aux fonctions. Tout ce dont vous avez besoin est de terminer votre fonction à l'aide de décorateurs. Plus d'explications ici: http://www.pythoncentral.io/time-a-python-function/
Le seul cas où vous pourriez être intéressé par l'écriture de vos propres instructions de minutage est si vous ne souhaitez exécuter une fonction qu'une seule fois et que vous souhaitez également obtenir sa valeur de retour.
L'avantage d'utiliser le
timeit
module est qu'il permet de répéter le nombre d'exécutions. Cela peut être nécessaire car d'autres processus peuvent interférer avec votre précision de synchronisation. Vous devez donc l'exécuter plusieurs fois et rechercher la valeur la plus basse.la source
timeit.timeit(lambda: func(a,b,c), number=1)
? J'utilise ceci lorsque je fais des tests sur une solution hypothétique dans un terminal.Timeit a deux gros défauts: il ne renvoie pas la valeur de retour de la fonction, et il utilise eval, qui nécessite de passer du code de configuration supplémentaire pour les importations. Cela résout les deux problèmes simplement et élégamment:
la source
Il existe un outil simple pour chronométrer. https://github.com/RalphMao/PyTimer
Cela peut fonctionner comme un décorateur :
Production:
Il peut également fonctionner comme une minuterie de plug-in avec contrôle de l'espace de noms (utile si vous l'insérez dans une fonction qui a beaucoup de codes et peut être appelée n'importe où ailleurs).
Production:
J'espère que cela aidera
la source
Méthode Decorator utilisant la bibliothèque Decorator Python:
Voir l'article sur mon blog:
publier sur le blog mobilepro.pl
mon message sur Google Plus
la source
Ma façon de faire:
Définissez une variable comme
start = time()
avant d'exécuter la fonction / les boucles, etprintTime(start)
juste après le bloc.et vous avez la réponse.
la source