Pregunta ¿Cómo obtengo el tiempo de ejecución de un programa Python?


Tengo un programa de línea de comandos en Python que tarda un tiempo en terminar. Quiero saber el tiempo exacto que toma terminar de correr.

He visto el timeit módulo, pero parece que es solo para pequeños fragmentos de código. Quiero cronometrar todo el programa.


592
2017-10-12 23:56


origen


Respuestas:


La forma más simple en Python:

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

Esto supone que su programa tarda al menos una décima de segundo en ejecutarse.

Huellas dactilares:

--- 0.764891862869 seconds ---

1024
2017-10-13 00:00



Puse esto timing.py módulo en mi propio site-packages directorio, y solo inserte import timing en la parte superior de mi módulo:

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

También puedo llamar timing.log desde mi programa si hay etapas significativas dentro del programa que quiero mostrar. Pero solo incluyendo import timing imprimirá los tiempos de inicio y fin, y el tiempo total transcurrido. (Perdona mi oscuro secondsToStr función, simplemente formatea un número de punto flotante de segundos a hh: mm: ss.sss formulario)

Nota: se puede encontrar una versión de Python 3 del código anterior aquí o aquí.


172
2017-10-13 02:08



En Linux o UNIX:

time python yourprogram.py

En Windows, consulte esta discusión de Stackoverflow: ¿Cómo medir el tiempo de ejecución del comando en la línea de comandos de Windows?


120
2017-10-12 23:59



import time

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

time.clock() devuelve el tiempo del procesador, lo que nos permite calcular solo el tiempo utilizado por este proceso (en Unix de todos modos). La documentación dice que "en cualquier caso, esta es la función que se debe usar para comparar los algoritmos Python o de temporización".


47
2017-10-13 01:25



Me gusta mucho la respuesta de Paul McGuire, pero uso Python3. Entonces, para aquellos que estén interesados: aquí hay una modificación de su respuesta que funciona con Python 3 en * nix (imagino, en Windows, que clock () debería usarse en lugar 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 le resulta útil, aún debe votar su respuesta en lugar de esta, ya que hizo la mayor parte del trabajo;).


43
2017-09-10 02:03



Puede usar el perfil de python cProfile para medir Tiempo de CPU y adicionalmente cuánto tiempo se usa dentro de cada función y cuántas veces se llama a cada función. Esto es muy útil si desea mejorar el rendimiento de su script sin saber por dónde empezar. Esta respuesta a otra pregunta SO es bastante bueno. Siempre es bueno echar un vistazo a los documentos también.

Aquí hay un ejemplo de cómo crear un perfil de un script usando cProfile desde una línea de comando:

$ 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



Me gusta el resultado datetime El módulo proporciona, donde los objetos delta del tiempo muestran días, horas, minutos, etc. según sea necesario de una manera legible para el ser humano.

Por ejemplo:

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

Muestra de salida, p.

Duration: 0:00:08.309267

o

Duration: 1 day, 1:51:24.269711

Actualizar: Como J.F. Sebastian mencionó, este enfoque podría encontrar algunos casos difíciles con la hora local, por lo que es más seguro usar:

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



Aún mejor para 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

Normalmente solo time es un shell incorporado más simple que sombrea el más capaz /usr/bin/time.


22
2017-10-13 06:10



La solución de rogeriopvl funciona bien, pero si quieres información más específica, puedes utilizar el generador de perfiles incorporado de python. Mira esta página:

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

un generador de perfiles le dice mucha información útil, como el tiempo empleado en cada función


11
2017-10-13 00:07



El siguiente fragmento imprime el tiempo transcurrido en una agradable lectura humana <HH:MM:SS> formato.

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