Prueba de velocidad de Python - Diferencia de tiempo - milisegundos

136

¿Cuál es la forma correcta de comparar 2 veces en Python para probar la velocidad de una sección de código? Intenté leer los documentos de la API. No estoy seguro de entender lo de Timedelta.

Hasta ahora tengo este código:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
BuddyJoe
fuente
15
¿Por qué no imprimiste t2-t1? ¿Qué te impidió restar?
S.Lott
18
Supongo que tuve el momento "no podría ser tan fácil".
BuddyJoe

Respuestas:

191

datetime.timedelta es solo la diferencia entre dos fechas y horas ... así que es como un período de tiempo, en días / segundos / microsegundos

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

¡Tenga en cuenta que c.microsecondssolo devuelve la porción de microsegundos de timedelta! Para fines de tiempo, siempre use c.total_seconds().

Puede hacer todo tipo de matemáticas con datetime.timedelta, por ejemplo:

>>> c / 10
datetime.timedelta(0, 0, 431654)

Sin embargo, podría ser más útil mirar el tiempo de la CPU en lugar del tiempo del reloj de pared ... eso depende del sistema operativo ... bajo sistemas similares a Unix, consulte el comando 'tiempo'.

NickZoic
fuente
Cualquier persona interesada en obtener el total de minutos puede usar int(c.total_seconds() / 60)en este caso
sufinawaz
2
La página del módulo timeit dice que el módulo "evita una serie de trampas comunes para medir los tiempos de ejecución". ¿Este enfoque (usando datetime.now) está sujeto a alguna de esas trampas?
kuzzooroo
@kuzzooroo sí, lo es! ¡Sería mejor usar timeit en lugar de este método! Por ejemplo, tengo una prueba en un gran proyecto de Python que, cuando se mide con este método, da como resultado un supuesto tiempo de ejecución de 0.25 s. En realidad, y según timeit, ¡el tiempo de ejecución de dicha función es en realidad de 30 segundos!
kazaamjt
62

Desde Python 2.7 existe el método timedelta.total_seconds (). Entonces, para obtener los milisegundos transcurridos:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
f.cipriani
fuente
20

También puedes usar:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

O podría usar los perfiladores de python .

Zitrax
fuente
1
Al usarlo start = time.clock()imprime DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead.
Contango
16

Sé que es tarde, pero en realidad me gusta mucho usar:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()te da segundos desde la época. Debido a que este es un tiempo estandarizado en segundos, simplemente puede restar el tiempo de inicio del tiempo de finalización para obtener el tiempo de proceso (en segundos). time.clock()es bueno para la evaluación comparativa, pero me ha parecido inútil si quieres saber cuánto tiempo llevó tu proceso. Por ejemplo, es mucho más intuitivo decir "mi proceso toma 10 segundos" que decir "mi proceso toma 10 unidades de reloj del procesador"

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

En el primer ejemplo anterior, se le muestra un tiempo de 0.05 para time.clock () frente a 0.06377 para time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

En el segundo ejemplo, de alguna manera el tiempo del procesador muestra "0" aunque el proceso durmió por un segundo. time.time()muestra correctamente un poco más de 1 segundo.

mgoldwasser
fuente
NameError: el nombre 'time' no está definido
Joe
Necesitas la import timedeclaración
mgoldwasser
5

El siguiente código debe mostrar la hora detla ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
killy971
fuente
4

Simplemente podría imprimir la diferencia:

print tend - tstart
algo
fuente
4

No soy un programador de Python, pero sí sé cómo usar Google y esto es lo que encontré: usa el operador "-". Para completar su código:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Además, parece que puede usar la función strftime () para formatear el cálculo del intervalo de tiempo para representar el tiempo, pero lo hace feliz.

Mike C.
fuente
ver segundo comentario en el nivel de pregunta.
BuddyJoe
15
"pero sí sé cómo usar Google", aunque aparentemente no sabes cómo usar Stack Overflow, porque el propósito de este sitio web es que la gente haga y responda preguntas de programación correctamente y hasta el punto, no dar un gruñido acerca de cómo "podrías haberlo puesto en Goggled".
Hejazzman
2

time.time () / datetime es bueno para un uso rápido, pero no siempre es 100% preciso. Por esa razón, me gusta usar uno de los perfiladores std lib (especialmente hotshot) para averiguar qué es qué.

nilamo
fuente
2

Es posible que desee ver en los módulos de perfil . Obtendrá una mejor lectura de dónde están sus ralentizaciones, y gran parte de su trabajo estará totalmente automatizado.

Stefan Kendall
fuente
2

Aquí hay una función personalizada que imita las funciones de Matlab / Octave tic toc.

Ejemplo de uso:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

Función:

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()
Ulad Kasach
fuente
Rastreo (última llamada más reciente): archivo "redis-get-response.py", línea 22, en <module> time_var = time_me (); # obtener una variable con la marca de tiempo actual Archivo "redis-get-response.py", línea 20, en time_me return time.time () NameError: el nombre 'time' no está definido
Joe
0

Puede usar timeit como este para probar un script llamado module.py

$ python -mtimeit -s 'import module'
Dhiraj Thakur
fuente
0

Flecha: mejores fechas y horas para Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Eds_k
fuente