Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En Desarrollo Última actualización: 25 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

En este tutorial, aprenderá a utilizar la función timeit del módulo timeit de Python. Aprenderá a cronometrar expresiones y funciones sencillas en Python.

Cronometrar su código puede ayudarle a obtener una estimación del tiempo de ejecución de un fragmento de código y también a identificar las secciones del código que deben optimizarse.

Empezaremos aprendiendo la sintaxis de la función timeit de Python. Y luego codificaremos ejemplos para entender cómo utilizarla para cronometrar bloques de código y funciones en su módulo Python. Comencemos.

Cómo utilizar la función timeit de Python

El módulo timeit forma parte de la biblioteca estándar de Python, y puede importarlo:

import timeit

La sintaxis para utilizar la función timeit del módulo timeit es la que se muestra a continuación:

timeit.timeit(stmt, setup, number)

Aquí

  • stmt es el trozo de código cuyo tiempo de ejecución se desea medir. Puede especificarlo como una simple cadena Python o una cadena multilínea, o pasar el nombre de la llamada.
  • Como su nombre indica, setup denota la pieza de código que debe ejecutarse una sola vez, a menudo como requisito previo para que se ejecute el stmt. Por ejemplo, supongamos que está calculando el tiempo de ejecución para la creación de una matriz NumPy. En este caso, la importación de numpy es el código de configuración y la creación real es la sentencia a cronometrar.
  • El parámetro number denota el número de veces que se ejecuta el stmt. El valor por defecto de número es 1 millón (1000000), pero también puede establecer este parámetro a cualquier otro valor de su elección.

Ahora que hemos aprendido la sintaxis para utilizar la función timeit(), empecemos a codificar algunos ejemplos.

Cronometrando Expresiones Python Simples

Timing-Simple-Python-Expressions

En esta sección, intentaremos medir el tiempo de ejecución de expresiones sencillas de Python utilizando timeit.

Inicie un REPL de Python y ejecute los siguientes ejemplos de código. Aquí, estamos calculando el tiempo de ejecución de las operaciones de exponenciación y división por el suelo para 10000 y 100000 ejecuciones.

Observe que pasamos la sentencia a cronometrar como una cadena de Python y utilizamos un punto y coma para separar las distintas expresiones de la sentencia.

>>> import timeit
>>> timeit.timeit('3**4;3//4',number=10000)
0.0004020999999738706

>>> timeit.timeit('3**4;3//4',number=100000)
0.0013780000000451764

Ejecutar timeit de Python en la línea de comandos

También puede utilizar timeit en la línea de comandos. He aquí el equivalente en la línea de comandos de la llamada a la función timeit:

$ python-m timeit -n [número] -s [configuración] [stmt]
  • python-m time representa que ejecutamos timeit como módulo principal.
  • n es una opción de línea de comandos que indica el número de veces que debe ejecutarse el código. Equivale al argumento número de la llamada a la función timeit().
  • Puede utilizar la opción -s para definir el código de configuración.

A continuación, reescribimos el ejemplo anterior utilizando el equivalente de la línea de comandos:

$ python -m timeit -n 100000 '3**4;3//4'
100000 bucles, el mejor de 5: 35,8 nseg por bucle

En este ejemplo, calculamos el tiempo de ejecución de la función len() incorporada. La inicialización de la cadena es el código de configuración que se pasa utilizando la opción s.

$ python -m timeit -n 100000 -s "cadena_1 = 'codificación'" 'len(cadena_1)'
100000 bucles, el mejor de 5: 239 nseg por bucle

En la salida, observe que obtenemos el tiempo de ejecución para la mejor de 5 ejecuciones. ¿Qué significa esto? Cuando ejecuta timeit en la línea de comandos, la opción de repetición r se establece en el valor predeterminado de 5. Esto significa que la ejecución del stmt durante el número de veces especificado se repite cinco veces, y se devuelve el mejor de los tiempos de ejecución.

Análisis de los métodos de inversión de cadenas mediante timeit

Cuando trabaje con cadenas en Pythones posible que desee invertirlas. Los dos enfoques más comunes para la inversión de cadenas son los siguientes:

  • Utilizando el troceado de cadenas
  • Utilizando la función reversed() y el método join()
Analysis-of-String-Reversal-Methods-Using-timeit

Invertir cadenas en Python utilizando el troceado de cadenas

Repasemos cómo funciona el troceado de cadenas y cómo puede utilizarlo para invertir una cadena Python. Utilizando la sintaxis some-string[start:stop ] devuelve una rebanada de la cadena comenzando en el índice start y extendiéndose hasta el índice stop-1. Veamos un ejemplo.

Consideremos la siguiente cadena 'Python'. La cadena tiene una longitud de 6 y la lista de índices es 0, 1, 2 hasta 5.

imagen-76
>>> cadena_1 = 'Python'

Al especificar tanto el valor de inicio como el de parada, se obtiene una rebanada de cadena que se extiende desde el inicio hasta la parada-1. Por lo tanto, string_1 [1:4 ] devuelve 'yth'.

imagen-77
>>> cadena_1 = 'Python'
>>> cadena_1[1:4]
'yth'

Cuando no se especifica el valor de inicio, se utiliza el valor de inicio por defecto de cero, y la rebanada comienza en el índice cero y se extiende hasta el tope - 1.

imagen-78

Aquí, el valor de parada es 3, por lo que la rebanada comienza en el índice 0 y llega hasta el índice 2.

>>> cadena_1[:3]
'Pyt'

Si no incluye el índice de parada, verá que la rebanada comienza en el índice de inicio (1) y se extiende hasta el final de la cadena.

imagen-80
>>> cadena_1[1:]
'ython'

Si se ignoran los valores de inicio y fin, se obtiene una rebanada de toda la cadena.

imagen-81
>>> cadena_1[::]
'Python'

Creemos una rebanada con el valor de paso. Establezca los valores de inicio, parada y paso en 1, 5 y 2, respectivamente. Obtenemos una rebanada de la cadena que comienza en 1 y se extiende hasta 4 (excluyendo el punto final 5) que contiene cada dos caracteres.

imagen-82
>>> cadena_1[1:5:2]
'yh'

Si utiliza un paso negativo, puede obtener una rebanada que comience al final de la cadena. Con el paso fijado en -2, cadena_1[5 :2:-2 ] da la siguiente rebanada:

imagen-83
>>> cadena_1[5:2:-2]
'nh'

Así que para obtener una copia invertida de la cadena, nos saltamos los valores de inicio y parada y fijamos el paso en -1, como se muestra:

>>> cadena_1[::-1]
'nohtyP'

En resumen: cadena[ ::-1] devuelve una copia invertida de la cadena.

Inversión de cadenas mediante funciones incorporadas y métodos de cadena

La función incorporada reversed() en Python devolverá un iterador inverso sobre los elementos de la cadena.

>>> cadena_1 = 'Python'
>>> invertido(cadena_1)
<objeto invertido en 0x00BEAF70&gt

Entonces puede hacer un bucle a través del iterador inverso utilizando un bucle para:

for char in invertida(cadena_1):
 print(char)

Y acceder a los elementos de la cadena en el orden inverso.

# Salida
n
o
h
t
y
P

A continuación, puede llamar al método join() en el iterador inverso con la sintaxis: <sep>.join(inverso(alguna-cadena)).

El fragmento de código siguiente muestra un par de ejemplos en los que el separador es un guión y un espacio en blanco, respectivamente.

>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y P'

Aquí no queremos ningún separador; así que establezca el separador en una cadena vacía para obtener una copia invertida de la cadena:

>>> ''.join(reversed(string1))
'nohtyP'

El uso de ".join(reversed( some-string)) devuelve una copia invertida de la cadena.

Comparación de los tiempos de ejecución mediante timeit

Hasta ahora, hemos aprendido dos enfoques para invertir cadenas en Python. Pero, ¿cuál de ellos es más rápido? Averigüémoslo.

En un ejemplo anterior en el que cronometramos expresiones sencillas de Python, no teníamos ningún código de configuración. Aquí, estamos invirtiendo la cadena Python. Mientras que la operación de inversión de la cadena se ejecuta durante el número de veces especificado por número, el código de configuración es la inicialización de la cadena que se ejecutará sólo una vez.

>>> import timeit
>>> timeit.timeit(stmt = 'cadena_1[::-1]', setup = "cadena_1 = 'Python'", número = 100000)
0.04951830000001678
>>> timeit.timeit(stmt = "''.join(invertida(cadena_1))", setup = "cadena_1 = 'Python'", número = 100000)
0.12858760000000302

Para el mismo número de ejecuciones para invertir la cadena dada, el enfoque de troceado de cadenas es más rápido que utilizar el método join() y la función invertida ().

También puede leer cómo invertir una lista en Python para hacerla girar hacia atrás.

Temporización de funciones de Python utilizando timeit

Temporización-Funciones-Python-Usando-timeit

En esta sección, vamos a aprender a temporizar funciones de Python con la función timeit. Dada una lista de cadenas, la siguiente función hasDigit devuelve la lista de cadenas que tienen al menos un dígito.

def hasDigit(somelist):
 str_with_digit = []
 for string in somelist:
 check_char = [char.isdigit() for char in string]
 if any(check_char):
 str_with_digit.append(string)
 return str_with_digit

Ahora nos gustaría medir el tiempo de ejecución de esta función Python hasDigit() utilizando timeit.

Identifiquemos primero la sentencia a cronometrar(stmt). Es la llamada a la función hasDigit( ) con una lista de cadenas como argumento. A continuación, definimos el código de configuración. ¿Puede adivinar cuál debe ser el código de configuración?

Para que la llamada a la función se ejecute correctamente, el código de configuración debe incluir lo siguiente:

  • La definición de la función hasDigit()
  • La inicialización de la lista de argumentos de cadenas

Definimos el código de configuración en la cadena setup, como se muestra a continuación:

setup = """
def hasDigit(somelist):
 str_with_digit = []
 for string in somelist:
 check_char = [char.isdigit() for char in string]
 if any(check_char):
 str_with_digit.append(string)
 return str_with_digit
thislist=['puffin3','7frost','blue']
 """

A continuación, podemos utilizar la función timeit y obtener el tiempo de ejecución de la función hasDigit( ) para 100000 ejecuciones.

import timeit
timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Salida
0.2810094920000097

Conclusión

Ha aprendido a utilizar la función timeit de Python para cronometrar expresiones, funciones y otros callables. Esto puede ayudarle a comparar su código, comparar los tiempos de ejecución de diferentes implementaciones de la misma función, y mucho más.

Repasemos lo que hemos aprendido en este tutorial. Puede utilizar la función timeit ( ) con la sintaxis timeit.timeit(stmt=...,setup=...,number=...). Alternativamente, puede ejecutar timeit en la línea de comandos para temporizar fragmentos cortos de código.

Como siguiente paso, puede explorar cómo utilizar otros paquetes de perfilado de Python como line-profiler y memprofiler para perfilar su código para el tiempo y la memoria, respectivamente.

A continuación, aprenda a calcular la diferencia de tiempo en Python.

  • Bala Priya C
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre desarrollo
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba Monday
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder