¿Qué es% timeit en Python?

96

Siempre leo el código para calcular el tiempo de esta manera:

%timeit function()

¿Puede explicar qué significa "%" aquí?

Creo que el "%" siempre se usa para reemplazar algo en una cadena, como% s significa reemplazar una cadena,% d reemplazar un dato, pero no tengo idea sobre este caso.

xirururu
fuente
16
Ese es un comando mágico de iPython. Ver: iPython Magics
MrAlexBailey

Respuestas:

91

%timeites una función mágica de ipython , que se puede usar para cronometrar un fragmento de código en particular (una sola declaración de ejecución o un solo método).

De los documentos:

%cronométralo

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Para usarlo, por ejemplo, si queremos saber si usar xrangees más rápido que usar range, simplemente puede hacer:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Y obtendrás los tiempos para ellos.

Las principales ventajas de %timeitson:

  • que no tiene que importar timeit.timeit desde la biblioteca estándar y ejecutar el código varias veces para averiguar cuál es el mejor enfoque.

  • % timeit calculará automáticamente el número de ejecuciones necesarias para su código en función de una ventana de ejecución total de 2 segundos.

  • También puede hacer uso de las variables de la consola actual sin pasar el fragmento de código completo, como en el caso de timeit.timeitconstruir la variable que está construida en otro entorno en el que funciona.

mu 無
fuente
1
¿Hay alguna forma de cronometrar una macro o un conjunto de líneas desde el shell ipython?
alpha_989
2
@ alpha_989 Sí, puede ajustar ese conjunto de líneas dentro de una función y luego programar la función como:%timeit function()
mu mu
@mu 無: Por favor aclare timer.timeit: ¿es ese un nombre de módulo real?
manantial
2
@fountainhead: docs.python.org/3/library/timeit.html#timeit.timeit
Sasha Chedygov
la salida 10000 loops, best of 3: 29.6 µs per loopse puede interpretar como: (1.) la expresión se ejecuta 10000 veces para obtener el tiempo total (2.) luego el tiempo total se divide por 10000 para obtener el tiempo "por ciclo" y (3.) se realiza el cálculo del tiempo total 3 veces y finalmente (4) de las 3 veces totales, el tiempo total mínimo (también conocido como "mejor de 3") se utiliza como salida. ¿Mi interpretación es correcta, sí / no?
Trevor Boyd Smith
37

Esto se conoce como una línea mágica en iPython. Son únicos en el sentido de que sus argumentos solo se extienden hasta el final de la línea actual, y la magia en sí está realmente estructurada para el desarrollo de la línea de comandos. timeitse utiliza para cronometrar la ejecución del código.

Si desea ver todas las magias que puede usar, simplemente puede escribir:

%lsmagic

para obtener una lista de magia de línea y magia de celda.

Más información mágica de la documentación aquí :

IPython tiene un sistema de comandos que llamamos magia que proporciona efectivamente un mini lenguaje de comandos que es ortogonal a la sintaxis de Python y es extensible por el usuario con nuevos comandos. Las magias están destinadas a escribirse de forma interactiva, por lo que utilizan convenciones de la línea de comandos, como el uso de espacios en blanco para separar argumentos, guiones para las opciones y otras convenciones típicas de un entorno de línea de comandos.

Dependiendo de si está en modo de línea o celular , hay dos formas diferentes de usar %timeit. Tu pregunta ilustra la primera forma:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :
miradulo
fuente
2

Solo me gustaría agregar otra ventaja útil de usar% timeit para responder por mu 無que:

  • También puede hacer uso de las variables de la consola actual sin pasar el fragmento de código completo como en el caso de timeit.timeit para construir la variable que está construida en otro entorno en el que timeit funciona.

PD: Sé que esto debería ser un comentario para responder arriba, pero actualmente no tengo suficiente reputación para eso, espero que lo que escribo sea útil para alguien y me ayude a ganar suficiente reputación para comentar la próxima vez.

Ankit Agrawal
fuente
1
También puede editar la respuesta de otra persona para mejorarla. Ya deberías tener suficiente reputación para eso
Tarick Welling
Gracias no lo sabía. @TarickWelling
Ankit Agrawal
2

Solo quería agregar un punto muy sutil sobre %% timeit. Dado que ejecuta la "magia" en la celda , obtendrá un error ...

UsageError: función mágica de línea %%timeitno encontrada

... si hay alguna línea de código / comentario por encima de %% timeit. En otras palabras, asegúrese de que %% timeit sea el primer comando en su celda.

Sé que es un pequeño punto al que todos los expertos dirán duh, pero solo quería agregar mi medio centavo para los jóvenes magos que comienzan con trucos de magia.

exitoso
fuente
1
Esto no es aplicable en el shell de iPython, solo en un cuaderno de Jupyter
snakecharmerb
0

Las magias de línea tienen el prefijo % y funcionan de manera muy similar a las llamadas de línea de comandos del sistema operativo: obtienen como argumento el resto de la línea, donde los argumentos se pasan sin paréntesis ni comillas. Las magias celulares tienen el prefijo %% doble , y son funciones que obtienen como argumento no solo el resto de la línea, sino también las líneas debajo de ella en un argumento separado.

Mohammad Salehi
fuente