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.
En programmation, il y a 2 principales façons de mesurer le temps avec des résultats différents :
>>> print(time.process_time()); time.sleep(10); print(time.process_time())
0.11751394000000001
0.11764988400000001 # took 0 seconds and a bit
>>> print(time.perf_counter()); time.sleep(10); print(time.perf_counter())
3972.465770326
3982.468109075 # took 10 seconds and a bit
Durée du processeur : Il s'agit du temps que ce processus spécifique passe à être activement exécuté sur le CPU. Le sommeil, l'attente d'une requête web ou le temps pendant lequel seuls d'autres processus sont exécutés n'y contribuent pas.
time.process_time()
Horloge murale : Il s'agit du temps écoulé "sur une horloge accrochée au mur", c'est-à-dire en dehors du temps réel.
Utilisez time.perf_counter()
time.time()
mesure également le temps de l'horloge murale, mais peut être remis à zéro, ce qui permet de remonter le temps.time.monotonic()
ne peut pas être remis à zéro (monotonique = va seulement en avant) mais a une précision plus faible que time.perf_counter()
Une autre façon agréable de chronométrer les choses est d'utiliser la fonction avec structure python.
avec appelle automatiquement la structure __enter__ y __exit__ ce qui est exactement ce dont nous avons besoin pour chronométrer les choses.
Créons un Minuterie classe.
from time import time
class Timer():
def __init__(self, message):
self.message = message
def __enter__(self):
self.start = time()
return None # could return anything, to be used like this: with Timer("Message") as value:
def __exit__(self, type, value, traceback):
elapsed_time = (time() - self.start) * 1000
print(self.message.format(elapsed_time))
Ensuite, on peut utiliser la classe Timer comme ceci :
with Timer("Elapsed time to compute some prime numbers: {}ms"):
primes = []
for x in range(2, 500):
if not any(x % p == 0 for p in primes):
primes.append(x)
print("Primes: {}".format(primes))
Le résultat est le suivant :
Primes : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499]
Temps écoulé pour calculer certains nombres premiers : 5.01704216003418ms
La réponse de Vadim Shender est excellente. Vous pouvez également utiliser un décorateur plus simple comme ci-dessous :
import datetime
def calc_timing(original_function):
def new_function(*args,**kwargs):
start = datetime.datetime.now()
x = original_function(*args,**kwargs)
elapsed = datetime.datetime.now()
print("Elapsed Time = {0}".format(elapsed-start))
return x
return new_function()
@calc_timing
def a_func(*variables):
print("do something big!")
Voici une mise à jour du code intelligent de Vadim Shender avec une sortie tabulaire :
import collections
import time
from functools import wraps
PROF_DATA = collections.defaultdict(list)
def profile(fn):
@wraps(fn)
def with_profiling(*args, **kwargs):
start_time = time.time()
ret = fn(*args, **kwargs)
elapsed_time = time.time() - start_time
PROF_DATA[fn.__name__].append(elapsed_time)
return ret
return with_profiling
Metrics = collections.namedtuple("Metrics", "sum_time num_calls min_time max_time avg_time fname")
def print_profile_data():
results = []
for fname, elapsed_times in PROF_DATA.items():
num_calls = len(elapsed_times)
min_time = min(elapsed_times)
max_time = max(elapsed_times)
sum_time = sum(elapsed_times)
avg_time = sum_time / num_calls
metrics = Metrics(sum_time, num_calls, min_time, max_time, avg_time, fname)
results.append(metrics)
total_time = sum([m.sum_time for m in results])
print("\t".join(["Percent", "Sum", "Calls", "Min", "Max", "Mean", "Function"]))
for m in sorted(results, reverse=True):
print("%.1f\t%.3f\t%d\t%.3f\t%.3f\t%.3f\t%s" % (100 * m.sum_time / total_time, m.sum_time, m.num_calls, m.min_time, m.max_time, m.avg_time, m.fname))
print("%.3f Total Time" % total_time)
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.