95 votes

Obtenir le temps d'exécution d'un bloc de code en Python 2.7

Je voudrais mesurer le temps écoulé pour évaluer un bloc de code dans un programme Python, en distinguant éventuellement le temps processeur utilisateur, le temps processeur système et le temps écoulé.

Je sais que le timeit mais j'ai beaucoup de fonctions auto-écrites et il n'est pas très facile de les de les passer dans le processus de configuration.

Je préférerais avoir quelque chose qui pourrait être utilisé comme :

#up to here I have done something....
start_counting() #or whatever command used to mark that I want to measure
                   #the time elapsed in the next rows
# code I want to evaluate
user,system,elapsed = stop_counting() #or whatever command says:
                                      #stop the timer and return the times

Les temps CPU utilisateur et système ne sont pas essentiels (même si j'aimerais les mesurer), mais pour le temps écoulé, j'aimerais pouvoir faire quelque chose comme ceci, plutôt que d'utiliser des commandes ou des modules compliqués.

191voto

Andrew Clark Points 77748

Pour obtenir le temps écoulé en secondes, vous pouvez utiliser timeit.default_timer() :

import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time

timeit.default_timer() est utilisé à la place de time.time() o time.clock() car il choisira la fonction de synchronisation qui a la plus haute résolution pour n'importe quelle plateforme.

28voto

Yarkee Points 1378

J'utilise toujours un décorateur pour faire un travail supplémentaire pour une fonction existante, y compris pour obtenir le temps d'exécution. C'est pythique et simple.

import time

def time_usage(func):
    def wrapper(*args, **kwargs):
        beg_ts = time.time()
        retval = func(*args, **kwargs)
        end_ts = time.time()
        print("elapsed time: %f" % (end_ts - beg_ts))
        return retval
    return wrapper

@time_usage
def test():
    for i in xrange(0, 10000):
        pass

if __name__ == "__main__":
    test()

13voto

Michael Herrmann Points 637

Je me suis retrouvé à résoudre ce problème encore et encore, alors j'ai finalement créé une bibliothèque pour ça. Installez avec pip install timer_cm . Alors :

from time import sleep
from timer_cm import Timer

with Timer('Long task') as timer:
    with timer.child('First step'):
        sleep(1)
    for _ in range(5):
        with timer.child('Baby steps'):
            sleep(.5)

Sortie :

Long task: 3.520s
  Baby steps: 2.518s (71%)
  First step: 1.001s (28%)

12voto

monklof Points 141

Vous pouvez y parvenir par le biais du gestionnaire de contexte, par exemple :

from contextlib import contextmanager
import time
import logging
@contextmanager
def _log_time_usage(prefix=""):
    '''log the time usage in a code block
    prefix: the prefix text to show
    '''
    start = time.time()
    try:
        yield
    finally:
        end = time.time()
        elapsed_seconds = float("%.2f" % (end - start))
        logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds)

utiliser un exemple :

with _log_time_usage("sleep 1: "):
    time.sleep(1)

1voto

valex Points 1362

Il y a une autre option que j'aime beaucoup maintenant pour la simplicité -. ipython . Dans ipython vous avez beaucoup de choses utiles en plus :

%time <expression> - pour obtenir directement le temps cpu et le temps de mur sur l'expression

%timeit <expression> - pour obtenir le temps cpu et wall dans une boucle d'expression

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