Avec le module Time de python, est-il possible de mesurer le temps écoulé ? Si oui, comment puis-je le faire ?
Je dois faire en sorte que si le curseur est resté dans un widget pendant une certaine durée, un événement se produise.
Avec le module Time de python, est-il possible de mesurer le temps écoulé ? Si oui, comment puis-je le faire ?
Je dois faire en sorte que si le curseur est resté dans un widget pendant une certaine durée, un événement se produise.
start_time = time.time()
# your code
elapsed_time = time.time() - start_time
Vous pouvez également écrire un décorateur simple pour simplifier la mesure du temps d'exécution de diverses fonctions :
import time
from functools import wraps
PROF_DATA = {}
def profile(fn):
@wraps(fn)
def with_profiling(*args, **kwargs):
start_time = time.time()
ret = fn(*args, **kwargs)
elapsed_time = time.time() - start_time
if fn.__name__ not in PROF_DATA:
PROF_DATA[fn.__name__] = [0, []]
PROF_DATA[fn.__name__][0] += 1
PROF_DATA[fn.__name__][1].append(elapsed_time)
return ret
return with_profiling
def print_prof_data():
for fname, data in PROF_DATA.items():
max_time = max(data[1])
avg_time = sum(data[1]) / len(data[1])
print "Function %s called %d times. " % (fname, data[0]),
print 'Execution time max: %.3f, average: %.3f' % (max_time, avg_time)
def clear_prof_data():
global PROF_DATA
PROF_DATA = {}
Utilisation :
@profile
def your_function(...):
...
Vous pouvez profiler plus d'une fonction simultanément. Ensuite, pour imprimer les mesures, il suffit d'appeler la fonction print_prof_data() :
Vous pouvez également jeter un coup d'œil à crochets de profil pip install profilehooks
et son page d'accueil ici
Notez que depuis Python 3.3, on devrait probablement utiliser time.monotonic()
plutôt que time.time()
lors de la mesure des délais ou des durées. docs.python.org/3/library/time.html#time.monotonic
time.time()
fera l'affaire.
import time
start = time.time()
# run your code
end = time.time()
elapsed = end - start
Vous pouvez consulter ce question, mais je ne pense pas que ce sera nécessaire.
time.time()
est une mauvaise idée car l'horloge du système peut être remise à zéro, ce qui vous fera remonter le temps. time.monotonic()
s'en occupe (monotonique = il va uniquement vers l'avant). time.perf_counter()
est également monotone, mais sa précision est encore plus élevée, c'est pourquoi elle est recommandée pour l'heure d'été.
Pour les utilisateurs qui souhaitent un meilleur formatage,
import time
start_time = time.time()
# your script
elapsed_time = time.time() - start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
s'imprimera, pendant 2 secondes :
'00:00:02'
et pendant 7 minutes une seconde :
'00:07:01'
Notez que l'unité de temps minimale avec gmtime est la seconde. Si vous avez besoin de microsecondes, considérez ce qui suit :
import datetime
start = datetime.datetime.now()
# some code
end = datetime.datetime.now()
elapsed = end - start
print(elapsed)
# or
print(elapsed.seconds,":",elapsed.microseconds)
strftime documentation
Pour la meilleure mesure du temps écoulé (depuis Python 3.3), utilisez time.perf_counter()
.
Renvoie la valeur (en secondes fractionnées) d'un compteur de performance, c'est-à-dire une horloge avec la plus haute résolution disponible pour mesurer une courte durée. Elle inclut le temps écoulé pendant le sommeil et s'applique à l'ensemble du système. Le point de référence de la valeur retournée est indéfini, de sorte que seule la différence entre les résultats d'appels consécutifs est valable.
Pour des mesures de l'ordre de l'heure ou du jour, vous ne vous souciez pas de la résolution à la seconde près. time.monotonic()
à la place.
Renvoie la valeur (en secondes fractionnaires) d'une horloge monotonique, c'est-à-dire une horloge qui ne peut pas revenir en arrière. L'horloge n'est pas affectée par les mises à jour de l'horloge du système. Le point de référence de la valeur retournée est indéfini, de sorte que seule la différence entre les résultats d'appels consécutifs est valable.
Dans de nombreuses implémentations, il s'agit en fait de la même chose.
Avant la version 3.3, vous devez vous contenter de time.clock()
.
Sous Unix, renvoie le temps actuel du processeur 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 de "temps processeur", dépend de celle de la fonction C du même nom.
Sous Windows, cette fonction renvoie les secondes d'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.
La nouveauté de Python 3.7 est PEP 564 -- Ajout de nouvelles fonctions temporelles avec une résolution de l'ordre de la nanoseconde.
Leur utilisation permet d'éliminer davantage les erreurs d'arrondi et de virgule flottante, en particulier si vous mesurez des périodes très courtes, ou si votre application (ou votre machine Windows) fonctionne depuis longtemps.
La résolution commence à tomber en panne le perf_counter()
après environ 100 jours. Ainsi, par exemple, après un an de fonctionnement, l'intervalle le plus court (supérieur à 0) qu'il peut mesurer sera plus grand qu'au début.
time.clock
a maintenant disparu.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
5 votes
N.B. que toute réponse utilisant
time.time()
est incorrecte. L'exemple le plus simple est celui d'un changement de l'heure du système pendant la période de mesure.0 votes
Pour votre question initiale concernant le déclenchement d'un événement si un curseur reste pendant une certaine durée sur un widget, docs.python.org/3/library/threading.html fournit tout ce dont vous avez besoin, je pense. Le multithreading et une variable de condition avec timeout pourraient être une des solutions. Cependant, il est actuellement difficile de répondre à votre situation.
2 votes
Il n'y a aucune raison pour que quelqu'un utilise
time.time()
pour mesurer le temps écoulé en python moderne (affecté par les changements manuels, la dérive, les secondes intercalaires etc). Cette réponse ci-dessous doit être plus élevé, étant donné que cette question est maintenant le premier résultat dans Google pour la mesure du temps écoulé.0 votes
Vous pouvez également mesurer le temps avec le profileur cProfile : docs.python.org/3/library/profile.html#module-cProfile stackoverflow.com/questions/582336/
1 votes
@NPras oublier "modern python". Il a toujours été incorrect d'utiliser
time.time()
.0 votes
@OrangeDog ce que je voulais dire c'est que
time.time
est toujours disponible dans le python moderne, après la dépréciation de l'optiontime.clock
et qu'il y a encore des gens qui l'utilisent. Mais oui, vous avez tout à fait raison de dire qu'il y avait jamais une bonne raison d'utilisertime.time
pour mesurer le temps écoulé, jamais.