Question Comment puis-je obtenir l'heure de l'exécution d'un programme Python?


J'ai un programme en ligne de commande en Python qui prend un certain temps pour terminer. Je veux connaître le temps exact qu'il faut pour finir de courir.

J'ai regardé le timeit module, mais il semble que ce soit seulement pour de petits extraits de code. Je veux chronométrer tout le programme.


592
2017-10-12 23:56


origine


Réponses:


Le moyen le plus simple en Python:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))

Cela suppose que votre programme nécessite au moins un dixième de seconde.

Impressions:

--- 0.764891862869 seconds ---

1024
2017-10-13 00:00



Je mets ça timing.py module dans mon propre site-packages répertoire, et insérez juste import timing en haut de mon module:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")

Je peux aussi appeler timing.log à partir de mon programme s'il y a des étapes importantes dans le programme que je veux montrer. Mais juste en incluant import timing imprimera les heures de début et de fin, et le temps écoulé global. (Pardonne mon obscur secondsToStr function, il formate juste un nombre à virgule flottante de secondes en hh: mm: ss.sss form.)

Note: Une version Python 3 du code ci-dessus peut être trouvée ici ou ici.


172
2017-10-13 02:08



Sous Linux ou UNIX:

time python yourprogram.py

Dans Windows, consultez cette discussion Stackoverflow: Comment mesurer le temps d'exécution de la commande dans la ligne de commande Windows?


120
2017-10-12 23:59



import time

start_time = time.clock()
main()
print time.clock() - start_time, "seconds"

time.clock() renvoie l'heure du processeur, ce qui nous permet de calculer uniquement le temps utilisé par ce processus (sous Unix de toute façon). La documentation dit "en tout cas, c'est la fonction à utiliser pour l'analyse comparative des algorithmes Python ou de chronométrage"


47
2017-10-13 01:25



J'aime vraiment la réponse de Paul McGuire, mais j'utilise Python3. Donc pour ceux qui sont intéressés: voici une modification de sa réponse qui fonctionne avec Python 3 sur * nix (j'imagine, sous Windows, que clock () devrait être utilisé à la place de time ()):

#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s, elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
atexit.register(endlog)
log("Start Program")

Si vous trouvez cela utile, vous devriez toujours voter sa réponse à la place de celle-ci, comme il l'a fait la plupart du travail;).


43
2017-09-10 02:03



Vous pouvez utiliser le profileur python cProfile pour mesurer Temps de processeur et en outre, combien de temps est passé à l'intérieur de chaque fonction et combien de fois chaque fonction est appelée. Ceci est très utile si vous voulez améliorer les performances de votre script sans savoir par où commencer. Cette réponse à une autre question SO est assez bonne. C'est toujours bon d'y jeter un coup d'œil les docs aussi.

Voici un exemple de profilage d'un script à l'aide de cProfile à partir d'une ligne de commande:

$ python -m cProfile euler048.py

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

37
2018-01-02 00:35



J'aime la sortie du datetime module fournit, où les objets temps delta montrent les jours, heures, minutes etc., comme nécessaire d'une manière lisible par l'homme.

Par exemple:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Exemple de sortie par ex.

Duration: 0:00:08.309267

ou

Duration: 1 day, 1:51:24.269711

Mettre à jour: Comme l'a mentionné J.F. Sebastian, cette approche peut rencontrer des cas difficiles avec l'heure locale, il est donc plus sûr d'utiliser:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))

31
2017-09-29 11:55



Encore mieux pour Linux: /usr/bin/time

$ /usr/bin/time -v python rhtest2.py

    Command being timed: "python rhtest2.py"
    User time (seconds): 4.13
    System time (seconds): 0.07
    Percent of CPU this job got: 91%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 15
    Minor (reclaiming a frame) page faults: 5095
    Voluntary context switches: 27
    Involuntary context switches: 279
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Normalement, juste time est un shell plus simple intégré dans les ombres les plus capables /usr/bin/time.


22
2017-10-13 06:10



La solution de rogeriopvl fonctionne bien, mais si vous voulez des informations plus spécifiques, vous pouvez utiliser le profileur intégré python. Vérifiez cette page:

http://docs.python.org/library/profile.html

un profileur vous dit beaucoup d'informations utiles comme le temps passé dans chaque fonction


11
2017-10-13 00:07



L'extrait suivant imprime le temps écoulé dans une belle lecture humaine <HH:MM:SS> format.

import time
from datetime import timedelta

start_time = time.time()

#
# Perform lots of computations.
#

elapsed_time_secs = time.time() - start_time

msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))

print(msg)    

10
2017-07-01 22:24