Streamlitは簡単にインタラクティブなウェブアプリケーションを作成できるPythonライブラリですが、動的な処理が多くなると、毎回計算をやり直すことでアプリケーションが遅くなることがあります。
このような問題を解決するために提供されているのが、@st.cache
デコレータです。
Streamlit 1.0以降では@st.cache_data
と@st.cache_resource
に分かれています。
Streamlitのキャッシュ機能について、基本から具体的な使い方まで詳しく解説します。
キャッシュの基本概念
キャッシュとは、データや計算結果を一時的に保存し、同じ処理を繰り返し実行しないようにする仕組みです。
これにより、アプリケーションの応答速度が向上し、ユーザー体験が改善されます。
Streamlitでは、以下の2つのキャッシュデコレータが提供されています。
@st.cache_data
データや計算結果をキャッシュします。@st.cache_resource
リソース(例:データベース接続や外部APIのクライアント)をキャッシュします。
これらを適切に使い分けることで、アプリケーションの効率を最適化できます。
データ処理のキャッシュ:@st.cache_data
以下は、@st.cache_data
を用いてデータ処理をキャッシュする例です。
import streamlit as st
import time
@st.cache_data
def expensive_computation(x):
time.sleep(2) # 計算に時間がかかる処理をシミュレーション
return x * x
st.write("キャッシュの例")
num = st.number_input("数値を入力してください", value=1)
result = expensive_computation(num)
st.write(f"結果: {result}")
- 初回実行時は関数
expensive_computation
が実行され、計算結果が保存されます。 - 同じ入力値で再度実行すると、保存された結果を直接取得します(処理が速くなります)。
リソースキャッシュ:@st.cache_resource
リソースキャッシュは、データベース接続や外部APIクライアントなど、リソースを共有する必要がある場合に使います。
import streamlit as st
import sqlite3
@st.cache_resource
def get_database_connection():
return sqlite3.connect("example.db")
st.write("リソースキャッシュの例")
conn = get_database_connection()
st.write(f"接続オブジェクト: {conn}")
キャッシュの管理と注意点
キャッシュの削除
キャッシュを手動でクリアする場合は、以下のコードを使用します。
st.cache_data.clear()
ユーザーインターフェースでキャッシュをクリアするには「Clear Cache」ボタンを使います。
注意点
- キャッシュされた関数は引数が変わると再計算されます。
- 関数の内部でキャッシュできないオブジェクト(例:非Picklableなオブジェクト)を使用しているとエラーになります。
- キャッシュの利用によりメモリ使用量が増える可能性があります。
旧@st.cacheと新しいデコレータの違い
以前のStreamlitでは@st.cache
がデータとリソースの両方を管理していましたが、バージョンアップにより次のように役割が明確化されました。
デコレータ | 役割 |
---|---|
@st.cache_data | データや計算結果をキャッシュする |
@st.cache_resource | リソースをキャッシュする |
- データ処理のキャッシュは、
@st.cache_data
に置き換えます。 - リソースキャッシュは、
@st.cache_resource
を使用します。
使用例 外部データの読み込みとキャッシュ
以下は、外部APIを使ったデータ取得処理にキャッシュを適用する例です。
import streamlit as st
import requests
@st.cache_data
def fetch_data_from_api(url):
response = requests.get(url)
return response.json()
st.write("APIデータのキャッシュ例")
url = "https://jsonplaceholder.typicode.com/posts"
data = fetch_data_from_api(url)
st.write(data[:5]) # 上位5件を表示
キャッシュを使うべきケースと使わないケース
使うべきケース
- 時間がかかる計算(機械学習モデルの予測、集計処理)
- 外部データの読み込み(API呼び出し、データベースクエリ)
使うべきではないケース
- リアルタイム性が必要な処理
- 短時間で頻繁に変わるデータ(例:株価データ)
まとめ
Streamlitのキャッシュ機能を活用することで、アプリケーションのパフォーマンスを大幅に改善できます。適切に@st.cache_data
と@st.cache_resource
を使い分け、効率的なアプリケーションを構築しましょう。