Link Search Menu Expand Document

Medir tiempo de ejecuci贸n

Medir el tiempo de ejecuci贸n de un programa es una tarea muy importante, ya que programar no s贸lo consiste en crear c贸digo que funcione, sino c贸digo que pueda ser ejecutado en un tiempo razonable. 驴Te imaginas que consultar tu saldo en la web del banco tardase 5 horas?

Imagina que tienes un determinado algoritmo que tarda en ejecutarse 1 segundo. A priori no parece demasiado, pero 驴y si tuvi茅ramos a 1000 usuarios ejecutando ese algoritmo peri贸dicamente? En este caso, podr铆a ser interesante optimizarlo, ya que una simple reducci贸n de 0.1 segundos, podr铆a aliviar la carga de nuestro sistema notablemente.

Por lo contrario, si tenemos un determinado algoritmo o proceso que tarda 1 segundo, pero es usado muy de vez en cuanto, tal vez no sea interesante invertir recursos en optimizarlo.

Afortunadamente, Python nos proporciona diferentes formas de medir el tiempo de ejecuci贸n de un programa.

Tiempo de ejecuci贸n con time

La librer铆a time es bastante completa, pero lo 煤nico que nos interesa para medir el tiempo de ejecuci贸n es el m茅todo time().

Este m茅todo nos devuelve el n煤mero de segundos, con precisi贸n de microsegundos, que han pasado desde el 1 de Enero de 1970.

import time
print(time.time()) # 1609954317.943479

Para medir el tiempo de ejecuci贸n de nuestros programas, basta con saber el tiempo que ha pasado antes y despu茅s de ejecutar nuestro programa, y la diferencia ser谩 el tiempo que ha tardado nuestro c贸digo.

import time
inicio = time.time()

# C贸digo a medir
time.sleep(1)
# -------------

fin = time.time()
print(fin-inicio) # 1.0005340576171875

En este caso podemos ver como el tiempo transcurrido es pr谩cticamente 1, ya que time.sleep(1) tarda 1 segundo en ejecutarse.

Podemos ver tambi茅n el tiempo que tardamos en calcular los primeros 10000000 n煤meros pares.

import time
inicio = time.time()

# C贸digo a medir
lista = [i for i in range(10000000) if i%2==0]
# -------------

fin = time.time()
print(fin-inicio) # 1.5099220275878906

Tiempo de ejecuci贸n con timeit

Python nos ofrece tambi茅n otra librer铆a denominada timeit, y est谩 pensada para medir tiempos de ejecuci贸n de fragmentos peque帽os de c贸digo. Puede ser usada por l铆nea de comandos o como una funci贸n dentro de Python.

El siguiente fragmento de c贸digo nos permite medir el tiempo de ejecuci贸n de la sentencia x=5. El argumento number es el n煤mero de veces que se ejecuta el fragmento de c贸digo.

import timeit
tiempo = timeit.timeit('x = 5', number=100000000)
print(tiempo) # 2.173444958

Es importante notar que el tiempo que se nos devuelve, es la suma de todas las ejecuciones. Es decir, el siguiente ejemplo tarda 2.17 segundos en ejecutar x=5 un total de 100000000 veces.

En el siguiente ejemplo vemos como la siguiente list comprehension tarda en ejecutarse una media de 0.18 segundos.

import timeit
tiempo = timeit.timeit('lista = [i for i in range(1000000) if i%2==0]', number=5)
# Calculamos el tiempo medio
print(tiempo/5) # 0.18671

Consejos y conclusiones

  • Para medir el tiempo de ejecuci贸n de tus programas, haz la media de varias ejecuciones. Debido a diferentes factores, nunca obtendr谩s el mismo resultado, por eso es importante realizar la media. Observa los diferentes valores que obtienes, y si son muy dispares, plant茅ate las cosas.
  • Si mides fragmentos de c贸digo que tardan muy poco en ejecutarse, deber谩s promediar m谩s valores.
  • Ten en cuenta que dependiendo de tu sistema operativo, la precisi贸n que obtendr谩s de las diferentes librer铆as puede variar.
  • No pierdas tiempo en optimizar c贸digos que apenas son usados. Dedica tiempo a analizar el c贸digo que requiere de optimizaci贸n y centra ah铆 tus esfuerzos.