Streamlit 应用在运行时,每次用户交互都会触发整个脚本的重新执行。

这意味着一些耗时操作,如数据加载、复杂计算和模型训练等,可能会被重复执行,严重影响应用响应速度。

本文介绍的缓存机制能够帮助我们解决这些问题,提高Streamlit 应用的性能。

Streamlit缓存机制就像是给应用配备了一个“记忆助手”,它允许开发者将特定函数的计算结果保存下来,当下次相同输入再次调用该函数时,无需重新执行函数,直接返回缓存结果,极大地提高了应用运行效率,减少等待时间。

1. 为什么需要缓存

Streamlit的机制是每次用户交互或代码更改时都会重新运行脚本,这样就导致了:

  1. 重复计算:长时间运行的函数可能会被多次调用,导致应用响应变慢
  2. 资源浪费:频繁加载和处理大量数据会消耗大量内存和计算资源
  3. 用户体验差:应用加载时间过长,影响用户交互体验

为了解决这些问题,Streamlit提供了缓存机制。

缓存机制就像是给应用配备了一个“记忆助手”,它允许开发者将特定函数的计算结果保存下来,当下次相同输入再次调用该函数时,无需重新执行函数,直接返回缓存结果。

通过缓存函数的输出结果,避免重复计算,能够显著提高应用的性能和响应速度。

2. 两种缓存装饰器

Streamlit提供了两种缓存装饰器:st.cache_datast.cache_resource,它们的主要区别在于缓存的对象类型和使用场景。

2.1. st.cache_data

st.cache_data是用于缓存数据的装饰器。

适用于缓存函数的输出结果,特别是那些返回可序列化数据对象的函数(如 Pandas DataFrameNumPy 数组、字符串、整数等)。

它的主要参数有:

  • ttl:缓存的生存时间(以秒为单位)。超过该时间后,缓存将失效并重新计算。
  • max_entries:缓存中允许的最大条目数。超出该数量时,最旧的缓存条目将被删除。
  • persist:是否将缓存持久化到磁盘上。默认为False
  • show_spinner:是否显示加载动画。默认为True
  • allow_output_mutation:是否允许返回值被修改。默认为False,建议谨慎使用。

2.2. st.cache_resource

st.cache_resource是用于缓存资源的装饰器。

适用于缓存那些需要初始化但不需要频繁重新计算的对象,如数据库连接、模型加载等。

它的主要参数有:

  • ttlmax_entries:与st.cache_data相同。
  • show_spinner:是否显示加载动画。默认为True
  • allow_output_mutation:是否允许返回值被修改。默认为False

2.3. 两者区别总结

st.cache_data st.cache_resource
使用场景 适用于缓存函数的输出结果,特别是那些返回可序列化数据对象的函数 适用于缓存那些需要初始化但不需要频繁重新计算的对象,如数据库连接、模型加载等
特点 缓存的是函数的输出结果,适合频繁调用且输出结果可能变化的场景 缓存的是资源对象本身,适合初始化耗时但不需要频繁更新的场景
缓存内容示例 从 API 获取数据、加载 CSV 文件、数据处理等 加载预训练模型、建立数据库连接等

3. 缓存使用示例

下面通过示例来演示这两种缓存装饰器的使用。

3.1. st.cache_data示例

假设我们有一个应用,需要从API获取数据并展示给用户。

由于数据加载可能需要较长时间,我们可以使用st.cache_data来缓存结果。

import streamlit as st
import requests
import pandas as pd # 使用 st.cache_data 缓存数据加载
@st.cache_data(ttl=3600) # 缓存 1 小时
def fetch_data(api_url):
response = requests.get(api_url)
data = response.json()
df = pd.DataFrame(data)
return df # 用户界面部分
st.title("使用 st.cache_data 缓存数据加载")
api_url = "https://jsonplaceholder.typicode.com/posts"
df = fetch_data(api_url)
st.write(df)

在这个例子中,fetch_data函数被@st.cache_data装饰器修饰。

第一次调用时,数据会被加载并缓存,后续调用时直接从缓存中读取,避免重复请求 API

直至1小时后,缓存失效之后才能重新请求。

3.2. st.cache_resource示例

假设我们有一个机器学习应用,需要加载一个预训练的模型。

由于模型加载可能需要较长时间,我们可以使用st.cache_resource来缓存模型对象。

import streamlit as st
import joblib # 使用 st.cache_resource 缓存模型加载
@st.cache_resource
def load_model(model_path):
model = joblib.load(model_path)
return model # 用户界面部分
st.title("使用 st.cache_resource 缓存模型加载")
model_path = "path/to/your/model.pkl"
model = load_model(model_path)
st.write("模型已加载,可以进行预测!")

在这个例子中,load_model函数被@st.cache_resource装饰器修饰。

模型加载后会被缓存,后续调用时直接从缓存中读取,避免重复加载。

4. 总结

Streamlit的缓存机制通过st.cache_datast.cache_resource提供了强大的性能优化功能。

它们可以帮助开发者减少重复计算、节省资源,并显著提高应用的响应速度。

在实际开发中,开发者可以根据需求选择合适的缓存装饰器:

  • 如果需要缓存函数的输出结果,使用st.cache_data
  • 如果需要缓存初始化的资源对象,使用st.cache_resource

合理使用缓存机制,可以让 Streamlit 应用更加高效和流畅,提升用户体验。

『玩转Streamlit』--缓存机制的更多相关文章

  1. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  2. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  3. 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势

    在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...

  4. 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践

    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...

  5. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

    2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...

  6. 2017-2018-2 20155303『网络对抗技术』Exp7:网络欺诈防范

    2017-2018-2 『网络对抗技术』Exp7:网络欺诈防范 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 二.实践过程记录 ...

  7. 20155308『网络对抗技术』Exp7:网络欺诈防范

    20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...

  8. # 2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范

    2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范 一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2. ...

  9. # 2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析

    2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析 实验目标与基础问题 ++1.实践目标++ 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析 ...

  10. 『HTML5挑战经典』是英雄就下100层-开源讲座(二)危险!英雄

    本篇为<『HTML5挑战经典』是英雄就下100层-开源讲座>第二篇,需要用到开源引擎lufylegend,可以到这里下载: 下载地址:http://lufylegend.googlecod ...

随机推荐

  1. dockerfile实现tomcat以及java的war包自动部署

    1. 下载jdk和tomcat wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.93/bin/apache-tomcat-8.5.93.tar.g ...

  2. 【Amadeus原创】wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。此响应不是合法的JSON响应。解决方法。

    两种报错方式: 1.此响应不是合法的JSON响应. 2.从服务器收到预料之外的响应.此文件可能已被成功上传.请检查媒体库或刷新本页. 情况:媒体服务器上传小文件没问题,大一点的文件报这个错误. 原因: ...

  3. 08C++选择结构(2)——教学

    一.逻辑变量 教学视频 存储类似灯亮或灯灭.是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量. 逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真) ...

  4. Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

    一.前言 通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面 ...

  5. Qt开发经验小技巧101-110

    如果需要在尺寸改变的时候不重绘窗体,则设置属性即可 this->setAttribute(Qt::WA_StaticContents, true); 这样可以避免可以避免对已经显示区域的重新绘制 ...

  6. U盘或光盘启动的Win7-8-10的PE系统制作步骤

    U盘或光盘启动的Win7-8-10的PE系统制作步骤 1.打开http://www.ushendu.com/下载PE制作工具 2.下载完成后安装到我的电脑, 把准备好的U盘插到电脑上,打开U深度PE制 ...

  7. JavaWeb代码架构中类之间的引用关系

    为了加深对Java Web代码架构中类之间的引用关系的理解和记忆,特绘制了这一张图. Java EE应用架构:

  8. MCU命令

    三D打印常用MCU命令 allocate_oids count=42 分配 42 个 OIDs,后续用于标识和管理不同的设备或组件 config_spi oid=0 pin=PD7 cs_active ...

  9. svtools lmerge具体算法

    svtools具有不同的子命令以实现不同的功能,其中一个就是lmerge.根据其帮助文档(merge LUMPY calls inside a single file from svtools lso ...

  10. JVM实战—12.OOM的定位和解决

    大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) ...