Si vous souhaitez simplement mesurer le temps écoulé de l'horloge murale entre deux points, vous pouvez utiliser time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Cela donne le temps d'exécution en secondes.
Une autre option depuis 3.3 pourrait être d'utiliser perf_counter
ou process_time
, selon vos besoins. Avant la 3.3, il était recommandé d'utiliser time.clock
(merci Amber ). Cependant, il est actuellement obsolète:
Sous Unix, renvoyez le temps processeur actuel sous la forme d'un nombre à virgule flottante exprimé en secondes. La précision, et en fait la définition même de la signification du «temps processeur», dépend de celle de la fonction C du même nom.
Sous Windows, cette fonction renvoie les secondes de l'horloge murale écoulées depuis le premier appel à cette fonction, sous la forme d'un nombre à virgule flottante, basé sur la fonction Win32 QueryPerformanceCounter()
. La résolution est généralement meilleure qu'une microseconde.
Déconseillé depuis la version 3.3 : Le comportement de cette fonction dépend de la plateforme: utilisez perf_counter()
ou à la process_time()
place , selon vos besoins, pour avoir un comportement bien défini.
time.clock()
est en fait préférable, car il ne peut pas être perturbé si l'horloge système est gâchée, mais.time()
accomplit principalement le même objectif.)print(timedelta(seconds=execution_time))
. Bien que ce soit une question distincte.Utilisez
timeit.default_timer
au lieu detimeit.timeit
. Le premier fournit automatiquement la meilleure horloge disponible sur votre plateforme et version de Python:timeit.default_timer est affecté à time.time () ou time.clock () selon le système d'exploitation. Sur Python 3.3+, default_timer est time.perf_counter () sur toutes les plateformes. Voir Python - time.clock () contre time.time () - précision?
Voir également:
la source
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
module (inexistant au moment de la réponse) qui fournit la même interface, mais il rend parfois différent destimeit
décisions du module sur la façon de mesurer les performances temporelles.Python 3 uniquement:
Étant donné que time.clock () est obsolète à partir de Python 3.3 , vous voudrez l'utiliser
time.perf_counter()
pour la synchronisation à l'échelle du système outime.process_time()
pour la synchronisation à l'échelle du processus, exactement comme vous l' utilisiez auparavanttime.clock()
:La nouvelle fonction
process_time
n'inclura pas le temps écoulé pendant le sommeil.la source
timeit.default_timer
au lieu detime.perf_counter
. Le premier choisira la minuterie appropriée pour mesurer les performances temporelles réglées pour votre plate-forme et votre version Python.process_time()
n'inclut pas le temps de sommeil et il n'est donc pas approprié de mesurer le temps écoulé.Étant donné une fonction que vous souhaitez chronométrer,
test.py:
le moyen le plus simple à utiliser
timeit
est de l'appeler à partir de la ligne de commande:N'essayez pas d'utiliser
time.time
outime.clock
(naïvement) de comparer la vitesse des fonctions. Ils peuvent donner des résultats trompeurs .PS. Ne placez pas d'instructions d'impression dans une fonction que vous souhaitez chronométrer; sinon le temps mesuré dépendra de la vitesse du terminal .
la source
C'est amusant de le faire avec un gestionnaire de contexte qui se souvient automatiquement de l'heure de début lors de l'entrée dans un
with
bloc, puis fige l'heure de fin à la sortie du bloc. Avec une petite ruse, vous pouvez même obtenir un décompte du temps écoulé à l'intérieur du bloc à partir de la même fonction de gestionnaire de contexte.La bibliothèque principale n'en a pas (mais devrait probablement l'être). Une fois en place, vous pouvez faire des choses comme:
Voici le code du gestionnaire de contexte suffisant pour faire l'affaire:
Et un code de démonstration exécutable:
Notez que par conception de cette fonction, la valeur de retour de
elapsed()
est gelée à la sortie du bloc et les appels suivants renvoient la même durée (d'environ 6 secondes dans cet exemple de jouet).la source
Temps de mesure en secondes:
Sortie :
la source
Je préfère ça.
timeit
doc est beaucoup trop déroutant.Notez qu'il n'y a pas de mise en forme ici, je viens d'écrire
hh:mm:ss
dans l'impression pour que l'on puisse interprétertime_elapsed
la source
Voici une autre façon de procéder:
Comparé à la manière traditionnelle:
Installation:
Reportez-vous à la page PyPi pour plus de détails.
la source
t.tic()
enterré dans le code, c'est à moi le développeur de garder une liste mentale de l'endroit dans la série où je devrais m'attendre à ce que ce soit. Vous trouvez-vous en train de créer des nids ou simplement plusieurs tictocs?ttictoc
. Un vrai bordel que j'avais, mais ça devrait être bien maintenant.Voici mes conclusions après avoir parcouru de nombreuses bonnes réponses ici ainsi que quelques autres articles.
Premièrement, si vous discutez entre
timeit
ettime.time
, letimeit
a deux avantages:timeit
sélectionne la meilleure minuterie disponible sur votre version OS et Python.timeit
désactive la collecte des ordures, cependant, ce n'est pas quelque chose que vous pouvez ou ne voulez pas.Maintenant, le problème n'est
timeit
pas aussi simple à utiliser, car il nécessite une configuration et les choses deviennent laides lorsque vous avez un tas d'importations. Idéalement, vous voulez juste un décorateur ou utiliser unwith
bloc et mesurer le temps. Malheureusement, il n'y a rien de intégré disponible pour cela, vous avez donc deux options:Option 1: utiliser la bibliothèque timebudget
Le timebudget est une bibliothèque polyvalente et très simple que vous pouvez utiliser en une seule ligne de code après l'installation de pip.
Option 2: utiliser directement le module de code
J'ai créé ci-dessous un petit module utilitaire.
Vous pouvez maintenant chronométrer n'importe quelle fonction simplement en plaçant un décorateur devant:
Si vous voulez chronométrer une partie du code, mettez-le simplement dans le
with
bloc:Avantages:
Il existe plusieurs versions à moitié sauvegardées, je tiens donc à souligner quelques points saillants:
with utils.MeasureBlockTime() as t
puist.elapsed
).la source
Utiliser
time.time
pour mesurer l'exécution vous donne le temps d'exécution global de vos commandes, y compris le temps d'exécution passé par d'autres processus sur votre ordinateur. C'est le moment que l'utilisateur remarque, mais ce n'est pas bien si vous voulez comparer différents extraits de code / algorithmes / fonctions / ...Plus d'informations sur
timeit
:Si vous souhaitez un aperçu plus approfondi du profilage:
Mise à jour : J'ai beaucoup utilisé http://pythonhosted.org/line_profiler/ au cours de l'année dernière et je le trouve très utile et je recommande de l'utiliser à la place du module de profil Pythons.
la source
Voici une petite classe de minuteur qui renvoie la chaîne "hh: mm: ss":
Usage:
la source
Les modules python cProfile et pstats offrent un excellent support pour mesurer le temps écoulé dans certaines fonctions sans avoir à ajouter de code autour des fonctions existantes.
Par exemple, si vous avez un script python timeFunctions.py:
Pour exécuter le profileur et générer des statistiques pour le fichier, vous pouvez simplement exécuter:
Cela consiste à utiliser le module cProfile pour profiler toutes les fonctions dans timeFunctions.py et à collecter les statistiques dans le fichier timeStats.profile. Notez que nous n'avons pas eu à ajouter de code au module existant (timeFunctions.py) et cela peut être fait avec n'importe quel module.
Une fois que vous avez le fichier stats, vous pouvez exécuter le module pstats comme suit:
Cela exécute le navigateur de statistiques interactif qui vous offre de nombreuses fonctionnalités intéressantes. Pour votre cas d'utilisation particulier, vous pouvez simplement vérifier les statistiques de votre fonction. Dans notre exemple, la vérification des statistiques pour les deux fonctions nous montre ce qui suit:
L'exemple factice ne fait pas grand-chose mais vous donne une idée de ce qui peut être fait. La meilleure partie de cette approche est que je n'ai pas à modifier le code existant pour obtenir ces numéros et, bien entendu, aider au profilage.
la source
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
vérifier votre version de python que vous utilisez. Je l'ai eu quand j'ai courupython3 -m cProfile...
etpython -m pstats
. Mon erreur, mais m'a eu une seconde, alors je voulais partagerdon't forget consistency
. =)Voici un autre gestionnaire de contexte pour le code de synchronisation -
Usage:
ou, si vous avez besoin de la valeur de temps
benchmark.py :
Adapté de http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
la source
Utilisez le module de profileur. Il donne un profil très détaillé.
il produit quelque chose comme:
Je l'ai trouvé très instructif.
la source
main()
? Serait plus utile si vous pouviez fournir un exemple de code simple.Je l'aime simple (python 3):
La sortie est en microsecondes pour une seule exécution:
Explication : timeit exécute la fonction anonyme 1 million de fois par défaut et le résultat est donné en secondes . Par conséquent, le résultat pour une seule exécution est le même, mais en microsecondes en moyenne.
Pour les opérations lentes , ajoutez un nombre d'itérations inférieur ou vous pourriez attendre indéfiniment:
La sortie est toujours en secondes pour le nombre total d'itérations:
la source
(Avec Ipython uniquement), vous pouvez utiliser % timeit pour mesurer le temps de traitement moyen:
et alors:
le résultat est quelque chose comme:
la source
Une autre façon d'utiliser timeit :
la source
sur python3:
élégant et court.
la source
Une sorte de réponse super tardive, mais peut-être qu'elle sert un but à quelqu'un. C'est une façon de faire qui je pense est super propre.
Gardez à l'esprit que "print" est une fonction de Python 3 et non de Python 2.7. Cependant, cela fonctionne avec toute autre fonction. À votre santé!
la source
Vous pouvez utiliser timeit.
Voici un exemple sur la façon de tester naive_func qui prend un paramètre à l'aide de Python REPL:
Vous n'avez pas besoin de la fonction wrapper si la fonction n'a pas de paramètres.
la source
lambda
serait plus succinct:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Nous pouvons également convertir le temps en temps lisible par l'homme.
la source
J'ai fait une bibliothèque pour ça, si vous voulez mesurer une fonction vous pouvez le faire comme ça
https://github.com/Karlheinzniebuhr/pythonbenchmark
la source
Pour obtenir un aperçu récursif de chaque appel de fonction, procédez comme suit:
Il prend juste ces 2 lignes de code dans un cahier Jupyter , et il génère un joli diagramme interactif. Par exemple:
Voici le code. Encore une fois, les 2 lignes commençant par
%
sont les seules lignes de code supplémentaires nécessaires pour utiliser snakeviz:Il semble également possible d'exécuter snakeviz en dehors des blocs-notes. Plus d'informations sur le site snakeviz .
la source
la source
Cette approche unique basée sur les classes offre une représentation de chaîne imprimable, un arrondi personnalisable et un accès pratique au temps écoulé sous forme de chaîne ou de flottant. Il a été développé avec Python 3.7.
Usage:
la source
Mesurer le temps d'exécution de petits extraits de code.
Source Python Docs !
la source
Si vous voulez pouvoir chronométrer les fonctions facilement, vous pouvez utiliser un simple décorateur:
Vous pouvez l'utiliser sur une fonction que vous souhaitez chronométrer comme ceci:
Ensuite, chaque fois que vous appelez
function_to_time
, il imprimera le temps nécessaire et le nom de la fonction à chronométrer.la source
basé sur la solution contextmanager proposée par https://stackoverflow.com/a/30024601/5095636 , ci-dessous la version gratuite de lambda, car flake8 met en garde contre l'utilisation de lambda selon E731 :
tester:
la source
La façon la plus simple de calculer la durée d'une opération:
la source
Voici un décorateur assez bien documenté et entièrement typé que j'utilise comme utilitaire général:
Exemple d'utilisation:
Les doctests peuvent être vérifiés avec:
Et le type indique:
la source
Callable[[AnyF], AnyF]
. Qu'est-ce que ça veut dire?AnyF
à signifierCallable[..., Any]
, ainsiAnyF
est une fonction qui peut prendre n'importe quelle quantité d'arguments de type et retourner n'importe quoi. Il enCallable[[AnyF], AnyF]
serait de même pourCallable[[Callable[..., Any]], Callable[..., Any]]
. C'est le type de la valeur de retour detimer
aka le type complet dedecorator
. C'est une fonction qui prend tout type de fonction comme seul argument et renvoie tout type de fonction.