『玩转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_datast.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 应用更加高效和流通,提升用户体验。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]