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 elstmt
. 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 denumpy
es el código deconfiguración
y la creación real es la sentencia a cronometrar. - El parámetro
number
denota el número de veces que se ejecuta elstmt
. El valor por defecto denú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

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 ejecutamostimeit
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 argumentonúmero
de la llamada a la funcióntimeit()
.- 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étodojoin()

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.

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

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

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.

>>> cadena_1[1:]
'ython'
Si se ignoran los valores de inicio
y fin
, se obtiene una rebanada de toda la cadena.

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

>>> 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:

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

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.