『玩转Streamlit』--缓存机制
Streamlit
应用在运行时,每次用户交互都会触发整个脚本的重新执行。
这意味着一些耗时操作,如数据加载、复杂计算和模型训练等,可能会被重复执行,严重影响应用响应速度。
本文介绍的缓存机制能够帮助我们解决这些问题,提高Streamlit
应用的性能。
而Streamlit
的缓存机制就像是给应用配备了一个“记忆助手”,它允许开发者将特定函数的计算结果保存下来,当下次相同输入再次调用该函数时,无需重新执行函数,直接返回缓存结果,极大地提高了应用运行效率,减少等待时间。
1. 为什么需要缓存
Streamlit
的机制是每次用户交互或代码更改时都会重新运行脚本,这样就导致了:
- 重复计算:长时间运行的函数可能会被多次调用,导致应用响应变慢
- 资源浪费:频繁加载和处理大量数据会消耗大量内存和计算资源
- 用户体验差:应用加载时间过长,影响用户交互体验
为了解决这些问题,Streamlit
提供了缓存机制。
缓存机制就像是给应用配备了一个“记忆助手”,它允许开发者将特定函数的计算结果保存下来,当下次相同输入再次调用该函数时,无需重新执行函数,直接返回缓存结果。
通过缓存函数的输出结果,避免重复计算,能够显著提高应用的性能和响应速度。
2. 两种缓存装饰器
Streamlit
提供了两种缓存装饰器:st.cache_data
和st.cache_resource
,它们的主要区别在于缓存的对象类型和使用场景。
2.1. st.cache_data
st.cache_data
是用于缓存数据的装饰器。
适用于缓存函数的输出结果,特别是那些返回可序列化数据对象的函数(如 Pandas DataFrame
、NumPy
数组、字符串、整数等)。
它的主要参数有:
ttl
:缓存的生存时间(以秒为单位)。超过该时间后,缓存将失效并重新计算。max_entries
:缓存中允许的最大条目数。超出该数量时,最旧的缓存条目将被删除。persist
:是否将缓存持久化到磁盘上。默认为False
。show_spinner
:是否显示加载动画。默认为True
。allow_output_mutation
:是否允许返回值被修改。默认为False
,建议谨慎使用。
2.2. st.cache_resource
st.cache_resource
是用于缓存资源的装饰器。
适用于缓存那些需要初始化但不需要频繁重新计算的对象,如数据库连接、模型加载等。
它的主要参数有:
ttl
和max_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_data
和st.cache_resource
提供了强大的性能优化功能。
它们可以帮助开发者减少重复计算、节省资源,并显著提高应用的响应速度。
在实际开发中,开发者可以根据需求选择合适的缓存装饰器:
- 如果需要缓存函数的输出结果,使用
st.cache_data
- 如果需要缓存初始化的资源对象,使用
st.cache_resource
合理使用缓存机制,可以让 Streamlit
应用更加高效和流畅,提升用户体验。
『玩转Streamlit』--缓存机制的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- 2017-2018-2 20155303『网络对抗技术』Exp7:网络欺诈防范
2017-2018-2 『网络对抗技术』Exp7:网络欺诈防范 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 二.实践过程记录 ...
- 20155308『网络对抗技术』Exp7:网络欺诈防范
20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...
- # 2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范
2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范 一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2. ...
- # 2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析
2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析 实验目标与基础问题 ++1.实践目标++ 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析 ...
- 『HTML5挑战经典』是英雄就下100层-开源讲座(二)危险!英雄
本篇为<『HTML5挑战经典』是英雄就下100层-开源讲座>第二篇,需要用到开源引擎lufylegend,可以到这里下载: 下载地址:http://lufylegend.googlecod ...
随机推荐
- openEuler欧拉安装Docker
1. dnf配置 # 更新镜像源缓存 dnf makecache # 修改chrony时间同步配置 sed -i 's/pool pool.ntp.org iburst/pool ntp.aliyu ...
- 6.MySQL性能优化
参数 作用范围 全局:对实例的所有会话起作用 会话级:只对当前会话起作用 set session binlog_rows_query_log_events = on; set global binlo ...
- 【javaweb】【Session】记录用户访问时间
效果 Servlet import jakarta.servlet.*; import jakarta.servlet.http.*; import jakarta.servlet.annotatio ...
- 【前端】【H5 API】拽托
拖曳操作需要借助于鼠标来实现,如文件或图片的移动操作等.在开发中,我们经常使用原生的JavaScript来实现拖曳效果,实现起来比较复杂.因此,HTML5为我们提供了更好用的接口或者事件,在很大程度上 ...
- Linux readonly
1. 概念readonly在shell脚本中,用来标记变量是只读的,后续执行过程中就不能对其值进行改变,这个用来定义一些常量类的变量. 如果对其进行重新赋值,会提示错误 [root@localhost ...
- 肖健雄(Jianxiong Xiao)的开源SFM代码SFMedu的运行方法
注意:本文是针对肖健雄(Jianxiong Xiao)博士的的开源SFM代码SFMedu(https://github.com/jianxiongxiao/SFMedu)的运行方法. 本人的运行环境: ...
- vue-cli@4搭建 vue + element-ui 项目实操
原文链接: vue-cli@4搭建 vue + element-ui 项目实操
- MySQL数据库驱动mysql-connector-java与数据库版本的匹配
jar包的下载地址:https://dev.mysql.com/downloads/file/?id=477058 之前我的MySQL数据库驱动mysql-connector-java版本号为5.1. ...
- C# AIModelRouter:使用不同的AI模型完成不同的任务
AIModelRouter AI模型路由,模型的能力有大小之分,有些简单任务,能力小一点的模型也能很好地完成,而有些比较难的或者希望模型做得更好的,则可以选择能力强的模型.为什么要这样做呢?可以降低A ...
- Java中hashCode() 和 equals()
该文章为转载(原文链接在结尾),虽然篇幅偏长,但是却能使你真正理解hashCode和queals各自的作用以及之间的联系,尤其是第四部分,读完肯定会让你有所收获. 第1部分 equals() 的作用 ...