web-dev-qa-db-fra.com

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

Je voudrais mesurer le temps écoulé pour évaluer un bloc de code dans un programme Python), en séparant éventuellement le temps utilisateur cpu, le temps système cpu du système et le temps écoulé.

Je connais le module timeit, mais j'ai beaucoup de fonctions auto-écrites et il n'est pas très facile de les transmettre dans le processus d'installation.

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 de calcul de l'utilisateur et du système ne sont pas essentiels (bien que j'aimerais les mesurer), mais je voudrais pouvoir faire quelque chose comme cela plutôt que d'utiliser des commandes ou des modules compliqués.

65
lucacerone

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() ou time.clock() car il choisira la fonction de minutage ayant la résolution la plus élevée pour n'importe quelle plate-forme.

140
Andrew Clark

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

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 __== "__main__":
    test()
23
Yarkee

Je me suis retrouvé résoudre ce problème encore et encore, alors j'ai finalement créé un bibliothèque pour cela. Installer avec pip install timer_cm. Ensuite:

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%)
10
Michael Herrmann

Vous pouvez y parvenir via le 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)

exemple d'utilisation:

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

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

%time <expression> - pour obtenir du temps de calcul direct et du temps passé au mur

%timeit <expression> - pour obtenir le temps de calcul du processeur et du mur dans une boucle d'expression

1
valex