『玩转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』--缓存机制的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 前端面试题及答案整理(一)
 - 下一篇: 【由技及道】CI/CD的量子纠缠术:Je