378 votes

Mesure du temps écoulé avec le module Time

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.

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é.

7voto

xjcl Points 608

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.

    • Utilisez 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()

5voto

Nurul Akter Towhid Points 1528

Vous devez importer time et ensuite utiliser la méthode time.time() pour connaître l'heure actuelle.

import time

start_time=time.time() #taking current time as starting time

#here your code

elapsed_time=time.time()-start_time #again taking current time - starting time

5voto

T.M. Points 111

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

2voto

Mohammad Points 51

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!")

0voto

Steve Points 579

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.com

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.

Powered by:

X