Funciones en Python con Caché

Hay ocasiones en las que ejecutamos funciones una y otra vez con los mismos parámetros. Si esas funciones son operaciones matemáticas o accesos a bases de datos pueden llegar a tener un coste computacional o un tiempo de ejecución demasiado elevado.

¿Y si añadimos una caché a nuestra función? En el caso de Python es muy sencillo de hacer. Basta con usar el parámetro _cache en la función. Se trata de una variable que se declara en el momento de la creación de la función y no dejará de existir hasta que la función llegue al final de su vida.

La variable _cache es un diccionario donde podremos almacenar cualquier dato. Para tenerla disponible en nuestra función basta con definirla entre los parámetros de nuestra función, así:

def mi_funcion(p1, p2, p3, ..., _cache={}):
    # código de mi función
    ...

Sencillo ¿no? ¿Esto para qué sirve? Para evitar tener que calcular algunos valores varias veces. Especialmente cuando son cáculos complejos podemos ahorrarnos algún tiempo.

Por ejemplo, la función a continuación devuelve la suma de mil veces la raiz cuadrada del número pasado por parámetro (la he calculado 1000 veces para que el coste sea mayor). Pero sólo la calcula la primera vez.

from math import sqrt

def my_sqrt(n, _cache={}):
    if not _cache.has_key(n):
        total = 0
        for i in range(1000):
            total = sqrt(n) + total
            _cache[n] = total

    return _cache[n]

¿Cuál es el resultado? Si medimos el tiempo de ejecución de esa función 2 veces seguidas el resultado es el siguiente:

>>> my_sqrt(200)
Tiempo:  0.000513
14142.135623731116

>>> my_sqrt(200)
Tiempo:  5.99999999995e-06
14142.135623731116

Obviamente el resultado es el mismo. Pero podemos observar que el tiempo de ejecucuión la segunda vez es unas 100 veces menor. Este es tan sólo un ejemplo tonto. En el caso de acceso de bases de datos la mejora puede ser mucho mayor (y nos ahorramos sobrecargarla).

Y ya está. ¡Espero que os haya gustado!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: