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

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'.


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


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 .


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.


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

4

Simplemente podría imprimir la diferencia:

print tend - tstart

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.


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é.


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.


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

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'

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.