2009-04-19 31 views
91

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

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 
+12

¿Por qué no imprimir t2-t1? ¿Qué te detuvo de restar? –

+16

Adivina, tuve el momento "no podría ser tan fácil". – BuddyJoe

Respuesta

130

datetime.timedelta es simplemente la diferencia entre dos datetimes ... así que es como un período de tiempo, en días/segundos/microsegundos

>>> 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 sólo se devuelve c.microseconds la parte microsegundos de la timedelta! Por motivos 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) 

Podría ser más útil mirar el tiempo de CPU en lugar de tiempo wallclock aunque ... que el sistema está operando dependiente aunque .. En sistemas tipo Unix, revisa el comando 'tiempo'.

+0

Cualquier persona interesada en obtener minutos totales puede usar 'int (c.total_seconds()/60)' en este caso – sufinawaz

+1

La [página del módulo timeit] (http://docs.python.org/library/timeit.html) dice que el módulo "evita una serie de trampas comunes para medir los tiempos de ejecución". ¿Está este enfoque (usando datetime.now) sujeto a cualquiera de esos inconvenientes? – kuzzooroo

3

Usted podría simplemente imprimir la diferencia:

print tend - tstart 
0

No soy un programador de Python, pero I do know how to use Google y esto es lo que encontré: se utiliza 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 se puede utilizar la función strftime() para formatear el cálculo de intervalo de tiempo con el fin de hacer que el tiempo, sin embargo te hace feliz.

+0

vea el segundo comentario en el nivel de pregunta. – BuddyJoe

+0

Mejor comentario que he visto en años. –

+3

"pero sí sé cómo usar Google"; al parecer, no se sabe cómo usar Stack Overflow, porque el propósito de este sitio web es que la gente haga y responda las preguntas de programación de forma correcta y directa, para no dar sordera a cómo "podrías haberlo arrinconado". – Hejazzman

2

El siguiente código debe mostrar el detla tiempo ...

from datetime import datetime 

tstart = datetime.now() 

# code to speed test 

tend = datetime.now() 
print tend - tstart 
2

time.time()/fecha y hora es buena para el uso rápido, pero no siempre es 100% precisa. Por esa razón, me gusta usar uno de los archivos estándar profilers (especialmente hotshot) para averiguar qué es qué.

18

También es posible usar:

import time 

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

O usted podría utilizar el python profilers.

2

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

0

usted podría utilizar timeit como este para probar un script llamado module.py

$ python -mtimeit -s 'import module' 
8

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

start = time.time() 

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

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

time.time() le da segundo puesto la época Debido a que este es un tiempo estandarizado en segundos, simplemente puede restar la hora de inicio del tiempo de finalización para obtener el tiempo del proceso (en segundos).time.clock() es bueno para la evaluación comparativa, pero he encontrado que es inútil si quieres saber cuánto tiempo tomó tu proceso. Por ejemplo, es mucho más intuitivo que decir "mi proceso tarda 10 segundos" de lo que es decir "mi proceso de toma unidades de reloj 10 de 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 muestra un tiempo de 0,05 para time.Clock() vs 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 de procesador muestra "0" a pesar de que el proceso durmió un segundo. time.time() correctamente muestra un poco más de 1 segundo.

36

Desde Python 2.7 existe el método timedelta.total_seconds(). Por lo tanto, 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 
1

Aquí es una función personalizada de tic que imitan las funciones de toc/octava de Matlab.

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() 
Cuestiones relacionadas