Si solo desea medir el tiempo transcurrido del reloj de pared entre dos puntos, puede usar time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Esto le da el tiempo de ejecución en segundos.
Otra opción desde 3.3 podría ser usar perf_counter
o process_time
, según sus requisitos. Antes de 3.3 se recomendaba usar time.clock
(gracias Amber ). Sin embargo, actualmente está en desuso:
En Unix, devuelve el tiempo actual del procesador como un número de coma flotante expresado en segundos. La precisión, y de hecho la definición misma del significado de "tiempo de procesador", depende de la función C del mismo nombre.
En Windows, esta función devuelve los segundos del reloj de pared transcurridos desde la primera llamada a esta función, como un número de coma flotante, basado en la función Win32 QueryPerformanceCounter()
. La resolución suele ser mejor que un microsegundo.
En desuso desde la versión 3.3 : el comportamiento de esta función depende de la plataforma: utilice perf_counter()
oprocess_time()
, en su lugar , según sus requisitos, tenga un comportamiento bien definido.
time.clock()
realidad , se prefiere la medición del rendimiento , ya que no se puede interferir si el reloj del sistema se enreda, pero en.time()
su mayoría cumple el mismo propósito.)print(timedelta(seconds=execution_time))
. Aunque es una pregunta aparte.Usar en
timeit.default_timer
lugar detimeit.timeit
. El primero proporciona el mejor reloj disponible en su plataforma y versión de Python automáticamente:timeit.default_timer se asigna a time.time () o time.clock () según el sistema operativo. En Python 3.3+ default_timer es time.perf_counter () en todas las plataformas. Ver Python - time.clock () vs. time.time () - precision?
Ver también:
fuente
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
módulo (inexistente en el momento de la respuesta) que proporciona la misma interfaz, pero a veces difiere de lastimeit
decisiones del módulo sobre cómo medir el rendimiento del tiempo.Python 3 solamente:
Como time.clock () está en desuso a partir de Python 3.3 , querrá usarlo
time.perf_counter()
para la sincronización de todo el sistema, otime.process_time()
para la sincronización de todo el proceso, tal como solía usartime.clock()
:La nueva función
process_time
no incluirá el tiempo transcurrido durante el sueño.fuente
timeit.default_timer
lugar detime.perf_counter
. El primero elegirá el temporizador apropiado para medir el rendimiento del tiempo ajustado para su plataforma y versión de Python.process_time()
hace no incluye el tiempo durante el sueño y por lo tanto no es apropiado para medir el tiempo transcurrido.Dada una función que le gustaría cronometrar,
test.py:
la forma más fácil de usar
timeit
es llamarlo desde la línea de comandos:No intente usar
time.time
otime.clock
(ingenuamente) para comparar la velocidad de las funciones. Pueden dar resultados engañosos .PD. No ponga declaraciones impresas en una función que desee cronometrar; de lo contrario, el tiempo medido dependerá de la velocidad del terminal .
fuente
Es divertido hacer esto con un administrador de contexto que recuerda automáticamente la hora de inicio al ingresar a un
with
bloque, luego congela la hora de finalización al salir del bloque. Con un pequeño truco, incluso puede obtener una cuenta del tiempo transcurrido dentro del bloque desde la misma función de administrador de contexto.La biblioteca principal no tiene esto (pero probablemente debería). Una vez en su lugar, puede hacer cosas como:
Aqui esta un código de administrador contexto suficiente para hacer el truco:
Y un código de demostración ejecutable:
Tenga en cuenta que mediante el diseño de esta función, el valor de retorno de
elapsed()
se congela al salir del bloque, y las llamadas adicionales devuelven la misma duración (de aproximadamente 6 segundos en este ejemplo de juguete).fuente
Tiempo de medición en segundos:
Salida :
fuente
Prefiero esto.
timeit
doc es demasiado confuso.Tenga en cuenta que no hay ningún formato aquí, simplemente escribí
hh:mm:ss
en la copia impresa para que uno pueda interpretartime_elapsed
fuente
Aquí hay otra forma de hacer esto:
Comparando con la forma tradicional:
Instalación:
Consulte la página de PyPi para más detalles.
fuente
t.tic()
enterrado en el código, depende del desarrollador mantener una lista mental de en qué parte de la serie debería esperar que esto sea. ¿Te encuentras configurando nidos o simplemente múltiples tictocs?ttictoc
. Tenía un desastre, pero ahora debería estar bien.Aquí están mis hallazgos después de pasar por muchas buenas respuestas aquí, así como algunos otros artículos.
Primero, si está debatiendo entre
timeit
ytime.time
,timeit
tiene dos ventajas:timeit
selecciona el mejor temporizador disponible en su sistema operativo y la versión de Python.timeit
deshabilita la recolección de basura, sin embargo, esto no es algo que puede desear o no.Ahora el problema es que
timeit
no es tan fácil de usar porque necesita configuración y las cosas se ponen feas cuando tienes un montón de importaciones. Idealmente, solo quieres un decorador o usarwith
bloquear y medir el tiempo. Desafortunadamente, no hay nada incorporado disponible para esto, por lo que tiene dos opciones:Opción 1: usar la biblioteca timebudget
El timebudget es una biblioteca versátil y muy simple que se puede utilizar sólo en una línea de código después de pepita instalar.
Opción 2: usar el módulo de código directamente
Creé a continuación un pequeño módulo de utilidad.
Ahora puede cronometrar cualquier función simplemente colocando un decorador frente a ella:
Si desea cronometrar la parte del código, simplemente póngalo dentro del
with
bloque:Ventajas:
Hay varias versiones con respaldo medio flotando, así que quiero señalar algunos aspectos destacados:
with utils.MeasureBlockTime() as t
y luegot.elapsed
).fuente
El uso
time.time
para medir la ejecución le brinda el tiempo de ejecución general de sus comandos, incluido el tiempo de ejecución empleado por otros procesos en su computadora. Es el momento en que el usuario se da cuenta, pero no es bueno si desea comparar diferentes fragmentos de código / algoritmos / funciones / ...Más información sobre
timeit
:Si desea una visión más profunda de la creación de perfiles:
Actualización : Utilicé mucho http://pythonhosted.org/line_profiler/ durante el último año y me resulta muy útil y recomiendo usarlo en lugar del módulo de perfil Pythons.
fuente
Aquí hay una pequeña clase de temporizador que devuelve la cadena "hh: mm: ss":
Uso:
fuente
Los módulos python cProfile y pstats ofrecen un gran soporte para medir el tiempo transcurrido en ciertas funciones sin tener que agregar ningún código alrededor de las funciones existentes.
Por ejemplo, si tiene un script python timeFunctions.py:
Para ejecutar el generador de perfiles y generar estadísticas para el archivo, simplemente puede ejecutar:
Lo que está haciendo es usar el módulo cProfile para perfilar todas las funciones en timeFunctions.py y recopilar las estadísticas en el archivo timeStats.profile. Tenga en cuenta que no tuvimos que agregar ningún código al módulo existente (timeFunctions.py) y esto se puede hacer con cualquier módulo.
Una vez que tenga el archivo de estadísticas, puede ejecutar el módulo pstats de la siguiente manera:
Esto ejecuta el navegador de estadísticas interactivas que le brinda una gran cantidad de funcionalidades. Para su caso de uso particular, puede verificar las estadísticas de su función. En nuestro ejemplo, la comprobación de estadísticas para ambas funciones nos muestra lo siguiente:
El ejemplo ficticio no hace mucho, pero le da una idea de lo que se puede hacer. La mejor parte de este enfoque es que no tengo que editar ninguno de mis códigos existentes para obtener estos números y obviamente ayudar con la creación de perfiles.
fuente
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
verificar tu versión de Python que estás ejecutando. Obtuve esto cuando corrípython3 -m cProfile...
ypython -m pstats
. Mi error me atrapó por un segundo, así que quería compartirdon't forget consistency
. =)Aquí hay otro administrador de contexto para el código de tiempo:
Uso:
o, si necesita el valor del tiempo
benchmark.py :
Adaptado de http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
fuente
Utilice el módulo perfilador. Da un perfil muy detallado.
produce algo como:
Lo he encontrado muy informativo.
fuente
main()
? Sería más útil si pudiera proporcionar un ejemplo de código simple.Me gusta simple (python 3):
La salida es microsegundos para una sola ejecución:
Explicación : timeit ejecuta la función anónima 1 millón de veces por defecto y el resultado se da en segundos . Por lo tanto, el resultado para 1 ejecución individual es la misma cantidad pero en microsegundos en promedio.
Para operaciones lentas , agregue un número menor de iteraciones o podría estar esperando para siempre:
La salida siempre está en segundos para el número total de iteraciones:
fuente
(Solo con Ipython) puede usar % timeit para medir el tiempo de procesamiento promedio:
y entonces:
el resultado es algo como:
fuente
Una forma más de usar timeit :
fuente
en python3:
Elegante y corto.
fuente
Una especie de respuesta súper posterior, pero tal vez tenga un propósito para alguien. Esta es una forma de hacerlo que creo que es super limpia.
Tenga en cuenta que "imprimir" es una función en Python 3 y no en Python 2.7. Sin embargo, funciona con cualquier otra función. ¡Salud!
fuente
Puedes usar timeit.
Aquí hay un ejemplo sobre cómo probar naive_func que toma parámetros usando Python REPL:
No necesita la función de contenedor si la función no tiene ningún parámetro.
fuente
lambda
sería más sucinto:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
También podemos convertir el tiempo en tiempo legible por humanos.
fuente
Hice una biblioteca para esto, si quieres medir una función puedes hacerlo así
https://github.com/Karlheinzniebuhr/pythonbenchmark
fuente
Para obtener información sobre todas las llamadas a funciones de forma recursiva, haga lo siguiente:
Solo toma esas 2 líneas de código en un cuaderno Jupyter , y genera un bonito diagrama interactivo. Por ejemplo:
Aquí está el código. Una vez más, las 2 líneas que comienzan con
%
son las únicas líneas de código adicionales necesarias para usar snakeviz:También parece posible ejecutar snakeviz fuera de los portátiles. Más información en el sitio web de snakeviz .
fuente
fuente
Este enfoque único basado en clases ofrece una representación de cadena imprimible, redondeo personalizable y un acceso conveniente al tiempo transcurrido como una cadena o un flotador. Fue desarrollado con Python 3.7.
Uso:
fuente
Mida el tiempo de ejecución de pequeños fragmentos de código.
Fuente Python Docs !
fuente
Si desea poder cronometrar funciones convenientemente, puede usar un decorador simple:
Puede usarlo en una función que desee cronometrar así:
Luego, cada vez que llame
function_to_time
, imprimirá cuánto tiempo tomó y el nombre de la función que se está cronometrando.fuente
basado en la solución de administrador de contexto dada por https://stackoverflow.com/a/30024601/5095636 , a continuación la versión gratuita lambda, ya que flake8 advierte sobre el uso de lambda según E731 :
prueba:
fuente
La forma más fácil de calcular la duración de una operación:
fuente
Aquí hay un decorador bastante bien documentado y completamente insinuado que utilizo como utilidad general:
Ejemplo de uso:
Los doctest se pueden consultar con:
Y el tipo sugiere:
fuente
Callable[[AnyF], AnyF]
. Qué significa eso?AnyF
para que signifiqueCallable[..., Any]
, por lo queAnyF
es una función que puede tomar cualquier cantidad de argumentos de tipo y devolver cualquier cosa. EntoncesCallable[[AnyF], AnyF]
se expandiría aCallable[[Callable[..., Any]], Callable[..., Any]]
. Este es el tipo del valor de retorno detimer
aka el tipo completo dedecorator
. Es una función que toma cualquier tipo de función como único argumento y devuelve cualquier tipo de función.