Skip to content
Tutoriales
Streamlit
Streamlit Caching: Unleashing the Power of Data Apps

Introducción a Streamlit y Caché

Streamlit es una biblioteca de Python de código abierto que permite a los desarrolladores crear aplicaciones web interactivas y amigables para proyectos de aprendizaje automático y ciencia de datos. Está diseñado para ayudar a los científicos de datos e ingenieros a convertir scripts de datos en aplicaciones web compartibles en solo unas pocas líneas de código, sin necesidad de habilidades de desarrollo front-end.

En cambio, el almacenamiento en caché es una técnica utilizada en informática para almacenar datos en un área de almacenamiento temporal conocida como caché, con el fin de acelerar la recuperación de datos. En el contexto de Streamlit, el almacenamiento en caché puede mejorar significativamente el rendimiento de tus aplicaciones web, especialmente cuando se trabaja con conjuntos de datos grandes o cálculos complejos.

¿Qué es Streamlit?

Streamlit supone un cambio radical en el campo de la ciencia de datos y el aprendizaje automático. Te permite construir aplicaciones de datos interactivas y sólidas de manera rápida. Con Streamlit, puedes crear hermosas aplicaciones web impulsadas por datos con solo unas pocas líneas de código en Python. Está diseñado para manejar conjuntos de datos grandes y cálculos complejos, lo que lo convierte en una herramienta poderosa para científicos de datos e ingenieros de aprendizaje automático.

¿Qué es el almacenamiento en caché?

El almacenamiento en caché es una técnica utilizada para almacenar datos temporalmente en una caché, que es una capa de almacenamiento de datos de alta velocidad. El propósito principal del almacenamiento en caché es aumentar la velocidad de recuperación de datos al reducir la necesidad de acceder a la capa de almacenamiento más lenta que está detrás. Cuando se solicitan los datos, el sistema primero verifica la caché. Si los datos se encuentran, se devuelven de inmediato. De lo contrario, el sistema busca los datos en el almacenamiento principal, los devuelve y también los almacena en la caché para futuras solicitudes.

¿Por qué necesitas el almacenamiento en caché en Streamlit?

En Streamlit, cada vez que se produce una interacción en la aplicación, se ejecuta el script completo de arriba a abajo. Si bien este modelo simplifica el modelo de programación, puede llevar a ineficiencias. Por ejemplo, si en tu script se incluye una función que carga un conjunto de datos grande o realiza un cálculo que consume mucho tiempo, no querrías ejecutar esa función cada vez que se vuelve a ejecutar el script. Aquí es donde entra en juego el almacenamiento en caché. Al usar el almacenamiento en caché de Streamlit, puedes asegurarte de que ciertas funciones solo se vuelvan a ejecutar cuando cambien sus entradas.

Los beneficios de usar el almacenamiento en caché de Streamlit

El almacenamiento en caché en Streamlit ofrece varios beneficios:

  • Mejora del rendimiento: Al almacenar los resultados de las llamadas costosas a funciones en la caché, puedes acelerar drásticamente tus aplicaciones de Streamlit. Esto es particularmente beneficioso cuando se trabaja con conjuntos de datos grandes o modelos de aprendizaje automático complejos que tardan mucho tiempo en cargarse o calcularse.

  • Aumento de la eficiencia: El almacenamiento en caché te permite evitar cálculos innecesarios. Si una función ha sido llamada anteriormente con los mismos argumentos, Streamlit puede recuperar el resultado de la caché en lugar de volver a ejecutar la función.

  • Mejora de la experiencia del usuario: Los tiempos de carga más rápidos y las aplicaciones más receptivas conducen a una mejor experiencia del usuario. Con el almacenamiento en caché, los usuarios no tienen que esperar a que se carguen los datos o se completen los cálculos cada vez que interactúan con tu aplicación.

El mecanismo de almacenamiento en caché de Streamlit permite a los desarrolladores almacenar los resultados de los cálculos de las funciones en una caché, lo que permite una recuperación más rápida de los datos y una mejora en el rendimiento de la aplicación. En esta sección, profundizaremos en cómo funciona el almacenamiento en caché de Streamlit, sus beneficios y los desafíos que presenta.

Desafíos del uso del almacenamiento en caché de Streamlit

Si bien el almacenamiento en caché es una función poderosa, también presenta algunos desafíos:

  • Gestión de la caché: La gestión de la caché puede ser complicada. Debes asegurarte de que la caché no consuma demasiada memoria y de que se invalide correctamente cuando cambien las entradas de una función en caché.

  • Depuración: La depuración puede ser más compleja con el almacenamiento en caché. Si la salida de una función se lee de la caché, cualquier sentencia de impresión o efecto secundario en la función no ocurrirá, lo que puede dificultar la depuración.

  • Persistencia de la caché: Por defecto, la caché de Streamlit se borra cada vez que se vuelve a ejecutar el servidor de Streamlit. Si necesitas caché persistente en varias ejecuciones, deberás utilizar opciones de almacenamiento en caché avanzadas o soluciones de almacenamiento en caché externas.

Cómo funciona el almacenamiento en caché de Streamlit

Streamlit proporciona un decorador llamado @st.cache, que puedes agregar antes de la definición de una función para habilitar el almacenamiento en caché. Cuando marcas una función con el decorador @st.cache, Streamlit verifica si esa función ha sido llamada con las mismas entradas antes. Si lo ha hecho, Streamlit lee la salida de la función desde la caché, lo cual es mucho más rápido que ejecutar la función. Si no, ejecuta la función, almacena el resultado en la caché y devuelve el resultado.

Aquí tienes un ejemplo sencillo de cómo usar el almacenamiento en caché de Streamlit:

@st.cache
def load_data():
    data = pd.read_csv('large_dataset.csv')
    return data

En este ejemplo, la función load_data se ejecutará solo una vez, independientemente de cuántas veces se vuelva a ejecutar el script. El resultado se almacena en la caché para su uso futuro, lo que ahorra tiempo y recursos computacionales.

Mecanismos de almacenamiento en caché de Streamlit: @st.cache, st.cache_data y st.cache_resource

Streamlit proporciona varios mecanismos de almacenamiento en caché que puedes utilizar según tus necesidades. Esta sección explicará las diferencias entre @st.cache, st.cache_data y st.cache_resource.

@st.cache

@st.cache es un decorador que puedes agregar antes de la definición de una función para habilitar el almacenamiento en caché. Cuando se llama a una función marcada con @st.cache, Streamlit verifica si la función se ha llamado antes con las mismas entradas. Si lo ha hecho, Streamlit lee la salida de la función desde la caché. Si no, ejecuta la función, almacena el resultado en la caché y devuelve el resultado.

Aquí tienes un ejemplo de cómo usar @st.cache:

```markdown
@st.cache
def load_data():
    data = pd.read_csv('large_dataset.csv')
    return data

En este ejemplo, la función load_data se ejecutará solo una vez, independientemente de cuántas veces se vuelva a ejecutar el script. El resultado se almacena en la caché para su uso futuro.

st.cache_data

El st.cache_data es un decorador utilizado para almacenar en caché funciones que devuelven datos, como transformaciones de dataframe, consultas de bases de datos o inferencia de aprendizaje automático. Los objetos en caché se almacenan en formato "pickled", lo que significa que el valor de retorno de una función en caché debe ser pickable. Cada llamada de la función en caché obtiene su propia copia de los datos en caché. Puede borrar la caché de una función con func.clear() o borrar toda la caché con st.cache_data.clear(). Si necesita almacenar en caché recursos globales, considere usar st.cache_resource en su lugar.

La firma de la función es la siguiente:

st.cache_data(func=None, *, ttl, max_entries, show_spinner, persist, experimental_allow_widgets, hash_funcs=None)

Los parámetros incluyen la función a almacenar en caché, el tiempo máximo para mantener una entrada en la caché, el número máximo de entradas para mantener en la caché, si se debe habilitar el spinner, la ubicación para persistir los datos en caché, si se deben permitir widgets en la función en caché, y un mapeo de tipos o nombres completamente calificados a funciones hash.

st.cache_resource

El st.cache_resource es un decorador utilizado para almacenar en caché funciones que devuelven recursos globales, como conexiones a bases de datos o modelos de aprendizaje automático. Los objetos en caché se comparten entre todos los usuarios, sesiones y ejecuciones. Deben ser seguros en términos de subprocesos, ya que se puede acceder a ellos desde varios subprocesos de forma simultánea. Si la seguridad de subprocesos es un problema, considere usar st.session_state para almacenar recursos por sesión en su lugar. Puede borrar la caché de una función con func.clear() o borrar toda la caché con st.cache_resource.clear().

La firma de la función es la siguiente:

st.cache_resource(func, *, ttl, max_entries, show_spinner, validate, experimental_allow_widgets, hash_funcs=None)

Los parámetros incluyen la función que crea el recurso en caché, el tiempo máximo para mantener una entrada en la caché, el número máximo de entradas para mantener en la caché, si se debe habilitar el spinner, una función de validación opcional para los datos en caché, si se deben permitir widgets en la función en caché, y un mapeo de tipos o nombres completamente calificados a funciones hash.

Uso de la memoria caché de Streamlit en la práctica: casos de uso y ejemplos

La memoria caché de Streamlit se puede utilizar en una variedad de escenarios para mejorar el rendimiento de sus aplicaciones de datos. En esta sección se explorarán algunos casos de uso comunes y se proporcionarán ejemplos de cómo implementar la memoria caché en Streamlit.

Almacenamiento en caché de modelos de aprendizaje automático

Cargar modelos de aprendizaje automático puede llevar tiempo, especialmente para modelos grandes. Al almacenar en caché el proceso de carga del modelo, puede acelerar significativamente sus aplicaciones de Streamlit. Aquí hay un ejemplo:

@st.cache(allow_output_mutation=True)
def load_model():
    model = load_your_model_here()  # reemplazar con su código de carga de modelos
    return model

En este ejemplo, se utiliza la opción allow_output_mutation=True porque los modelos de aprendizaje automático a menudo contienen tipos no hashables, que no son compatibles con la memoria caché predeterminada de Streamlit.

Almacenamiento en caché de visualización de datos

La visualización de datos puede ser un proceso intensivo en términos de cómputo, especialmente cuando se trabaja con conjuntos de datos grandes. Almacenar en caché los resultados de las funciones de visualización de datos puede hacer que sus aplicaciones de Streamlit sean más receptivas. Aquí hay un ejemplo:

@st.cache
def create_plot(data):
    fig = perform_expensive_plotting_here(data)  # reemplazar con su código de visualización
    return fig

En este ejemplo, la función create_plot se volverá a ejecutar solo si cambia la entrada data, lo que ahorra tiempo y recursos computacionales.

Almacenamiento en caché de llamadas a API

Si su aplicación de Streamlit realiza llamadas a una API, el almacenamiento en caché puede ayudarlo a evitar los límites de la tasa de API y mejorar el rendimiento de su aplicación al reducir el número de llamadas a la API. Aquí hay un ejemplo:

@st.cache
def fetch_data(api_url):
    response = requests.get(api_url)
    return response.json()

En este ejemplo, la función fetch_data solo realizará una llamada a la API si se llama con una nueva api_url. De lo contrario, devolverá la respuesta en caché.

Almacenamiento en caché de resultados de raspado web

El raspado web puede ser un proceso lento y raspar repetidamente el mismo sitio web puede hacer que su dirección IP sea bloqueada. Al almacenar en caché los resultados de las funciones de raspado web, puede evitar solicitudes de red innecesarias. Aquí hay un ejemplo:

@st.cache
def scrape_website(url):
    data = perform_web_scraping_here(url)  # reemplazar con su código de raspado web
    
    return data

En este ejemplo, la función scrape_website solo realizará el raspado del sitio web si se llama con una nueva url. De lo contrario, devolverá los datos en caché.

Mejores prácticas para almacenar en caché en Streamlit

Cuando se utiliza el almacenamiento en caché de Streamlit, hay varias mejores prácticas que se deben tener en cuenta:

  • Use @st.cache con moderación: Si bien el almacenamiento en caché puede mejorar significativamente el rendimiento de su aplicación, también puede consumir mucha memoria si no se utiliza con cuidado. Use @st.cache solo para funciones que realicen cálculos costosos o carguen conjuntos de datos grandes.

  • Evite los efectos secundarios en las funciones en caché: Las funciones marcadas con @st.cache no deben tener efectos secundarios. Los efectos secundarios son cambios que una función realiza en su entorno, como modificar una variable global o escribir en un archivo. Si una función con efectos secundarios se almacena en caché, los efectos secundarios solo ocurrirán la primera vez que se llame a la función.

  • Tenga cuidado con los argumentos mutables: Si una función en caché toma argumentos mutables, como listas o diccionarios, tenga en cuenta que Streamlit utiliza los valores iniciales de estos argumentos para identificar el resultado en caché. Si modifica los argumentos después de llamar a la función, Streamlit no reconocerá las modificaciones y devolverá el resultado en caché.

- **Considera usar `allow_output_mutation=True` para salidas no hashables:** Por defecto, la caché de Streamlit requiere que las salidas de la función sean hashables. Si tu función devuelve una salida no hashable, como un modelo de aprendizaje automático, puedes usar la opción `allow_output_mutation=True` para evitar este requisito.

## Bonus: Widgets interactivos de Streamlit

Los widgets interactivos de Streamlit son una característica clave que lo diferencia de otras herramientas de visualización de datos. Estos widgets permiten a los usuarios interactuar con tus aplicaciones de Streamlit, lo que les permite controlar el comportamiento de tu aplicación e interactuar con tus datos en tiempo real.

### Slider (Deslizador)

El widget de deslizador permite a los usuarios seleccionar un valor o un rango de valores deslizando un control a lo largo de una escala horizontal. Esto es útil para permitir a los usuarios controlar parámetros numéricos en tu aplicación.

```python
age = st.slider('¿Cuántos años tienes?', 0, 130, 25)
st.write("Tengo ", age, 'años')

En este ejemplo, el deslizador permite a los usuarios seleccionar una edad entre 0 y 130, con el valor predeterminado establecido en 25.

Checkbox (Casilla de verificación)

El widget de casilla de verificación permite a los usuarios activar o desactivar una opción binaria. Esto es útil para permitir a los usuarios habilitar o deshabilitar ciertas características en tu aplicación.

agree = st.checkbox('Estoy de acuerdo')
if agree:
    st.write('¡Genial!')

En este ejemplo, la casilla de verificación permite a los usuarios estar de acuerdo o en desacuerdo con una declaración. Si el usuario marca la casilla, la aplicación muestra el mensaje "¡Genial!".

Text Input (Entrada de texto)

El widget de entrada de texto permite a los usuarios ingresar una cadena de texto. Esto es útil para permitir a los usuarios ingresar datos de texto en tu aplicación.

title = st.text_input('Título de la película', 'La vida de Brian')
st.write('El título de la película actual es', title)

En este ejemplo, la entrada de texto permite a los usuarios ingresar un título de película.

¿Has oído hablar de esta increíble herramienta de análisis y visualización de datos que convierte tu aplicación de Streamlit en Tableau?

PyGWalker (opens in a new tab) es una biblioteca de Python que te ayuda a incrustar fácilmente una interfaz similar a Tableau en tu propia aplicación de Streamlit sin esfuerzo. Mira este increíble video producido por Sven de Coding is Fun (opens in a new tab) que muestra los pasos detallados para potenciar tu aplicación de Streamlit con esta potente biblioteca de visualización de datos en Python!


Agradecimientos especiales a Sven y su gran contribución (opens in a new tab) a la comunidad de PyGWalker.

Además, también puedes consultar la página de GitHub de PyGWalker (opens in a new tab) para ver más ejemplos de PyGWalker.

Conclusion

El mecanismo de caché de Streamlit es una herramienta poderosa que puede acelerar significativamente tu aplicación evitando cálculos innecesarios. Al comprender cómo funciona la caché de Streamlit y cómo usarla de manera efectiva, puedes crear aplicaciones más eficientes y receptivas. Ya sea que estés almacenando en caché transformaciones de datos, modelos de aprendizaje automático o llamadas a API, la caché de Streamlit puede ayudarte a brindar una experiencia de usuario más fluida e interactiva.

Recuerda que si bien la caché puede mejorar el rendimiento, no siempre es la solución adecuada. Siempre considera los compromisos y asegúrate de probar tu aplicación a fondo para asegurarte de que la caché está mejorando el rendimiento de tu aplicación sin introducir un comportamiento inesperado.

Los widgets interactivos de Streamlit, como los deslizadores, las casillas de verificación y las entradas de texto, brindan una forma para que los usuarios interactúen con tu aplicación y controlen su comportamiento. Al combinar estos widgets con el mecanismo de caché de Streamlit, puedes crear aplicaciones de datos potentes y receptivas.

En definitiva, la simplicidad, flexibilidad y enfoque de Streamlit en datos y aprendizaje automático lo convierten en una excelente opción para construir aplicaciones de datos. Con su mecanismo de caché y widgets interactivos, puedes crear aplicaciones que no solo sean poderosas y eficientes, sino también interactivas y atractivas.

¿Has oído hablar de esta increíble herramienta de análisis y visualización de datos que convierte tu aplicación de Streamlit en Tableau?

PyGWalker (opens in a new tab) es una biblioteca de Python que te ayuda a incrustar fácilmente una interfaz similar a Tableau en tu propia aplicación de Streamlit sin esfuerzo.

PyGWalker para visualización de datos en Streamlit (opens in a new tab)

Preguntas frecuentes

¿Cómo funciona la caché de Streamlit?

El mecanismo de caché de Streamlit funciona almacenando los resultados de las llamadas a funciones en una caché. Cuando se llama a una función decorada con @st.cache, Streamlit verifica si la función ha sido llamada con las mismas entradas antes. Si es así, Streamlit puede omitir la ejecución de la función y en su lugar utilizar el resultado en caché. Esto puede acelerar significativamente tu aplicación evitando cálculos costosos, como cargar datos o ejecutar un modelo de aprendizaje automático.

¿Cuáles son las limitaciones de la caché de Streamlit?

Si bien el mecanismo de caché de Streamlit es poderoso, tiene algunas limitaciones. Por ejemplo, el valor de retorno de una función en caché debe ser "pickleable", lo que significa que se puede serializar y deserializar utilizando el módulo pickle de Python. Esto significa que no todos los objetos de Python se pueden devolver desde una función en caché. Además, las funciones en caché no deben tener efectos secundarios, ya que estos solo se ejecutarán la primera vez que se llame a la función.

¿Cómo se borra la caché en Streamlit?

Puedes borrar la caché en Streamlit utilizando la función st.cache.clear(). Esto eliminará todas las entradas de la caché. Si quieres borrar la caché para una función específica, puedes usar el método func.clear(), donde func es la función en caché.

¿Dónde se encuentra la caché de Streamlit? El caché de Streamlit se almacena en la memoria de manera predeterminada. Esto significa que el caché se borra cada vez que se reinicia tu aplicación de Streamlit. Sin embargo, puedes configurar Streamlit para que persista el caché en disco estableciendo el parámetro persist del decorador @st.cache en True.