重要
这是一个实验性功能。实验性功能及其API可能会随时更改或删除。要了解更多信息,请点击这里。
持久化备忘录缓存目前不支持TTL。如果指定了persist
,ttl
将被忽略:
import streamlit as st
@st.experimental_memo(ttl=60, persist="disk")
def load_data():
return 42
st.write(load_data())
并且会在您的终端记录一个警告:
streamlit run app.py
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://192.168.1.1:8501
2022-09-22 13:35:41.587 The memoized function 'load_data' has a TTL that will be ignored. Persistent memo caches currently don't support TTL.
示例
在下面的示例中,按下“清除所有”按钮将清除所有使用@st.experimental_memo
装饰的函数中的记忆值。
import streamlit as st
@st.experimental_memo
def square(x):
return x**2
@st.experimental_memo
def cube(x):
return x**3
if st.button("Clear All"):
# Clear values from *all* memoized functions:
# i.e. clear values from both square and cube
st.experimental_memo.clear()
st
elements in cache-decorated functions Replay static
使用@st.experimental_memo
装饰的函数可以包含静态的st
元素。当执行一个带有缓存装饰的函数时,我们会记录生成的元素和块消息,因此即使由于结果被缓存而跳过函数的执行,这些元素也会出现在应用程序中。
在下面的示例中,@st.experimental_memo
装饰器用于缓存 load_data
函数的执行,该函数返回一个 pandas DataFrame。请注意,缓存的函数还包含一个 st.area_chart
命令,当函数因为结果被缓存而被跳过时,该命令将被重放。
import numpy as np
import pandas as pd
import streamlit as st
@st.experimental_memo
def load_data(rows):
chart_data = pd.DataFrame(
np.random.randn(rows, 10),
columns=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)
# Contains a static element st.area_chart
st.area_chart(chart_data) # This will be recorded and displayed even when the function is skipped
return chart_data
df = load_data(20)
st.dataframe(df)

支持的静态 st
元素在缓存装饰函数中包括:
st.alert
st.altair_chart
st.area_chart
st.audio
st.bar_chart
st.ballons
st.bokeh_chart
st.caption
st.code
st.components.v1.html
st.components.v1.iframe
st.container
st.dataframe
st.echo
st.empty
st.error
st.exception
st.expander
st.experimental_get_query_params
st.experimental_set_query_params
st.form
st.form_submit_button
st.graphviz_chart
st.help
st.image
st.info
st.json
st.latex
st.line_chart
st.markdown
st.metric
st.plotly_chart
st.progress
st.pydeck_chart
st.snow
st.spinner
st.success
st.table
st.text
st.vega_lite_chart
st.video
st.warning
Replay input widgets in cache-decorated functions
除了静态元素外,使用@st.experimental_memo
装饰的函数也可以包含输入小部件!默认情况下,重放输入小部件是禁用的。要启用它,您可以将@st.experimental_memo
的experimental_allow_widgets
参数设置为True
。下面的示例启用了小部件重放,并展示了在缓存装饰函数中使用复选框小部件的情况。
import streamlit as st
# Enable widget replay
@st.experimental_memo(experimental_allow_widgets=True)
def func():
# Contains an input widget
st.checkbox("Works!")
func()
如果缓存装饰的函数包含输入小部件,但experimental_allow_widgets
设置为False
或未设置,Streamlit 将抛出CachedStFunctionWarning
,如下所示:
import streamlit as st
# Widget replay is disabled by default
@st.experimental_memo
def func():
# Streamlit will throw a CachedStFunctionWarning
st.checkbox("Doesn't work")
func()

How widget replay works
让我们揭开缓存装饰函数中小部件重放的神秘面纱,并对其概念有一个理解。小部件的值被视为函数的额外输入,并用于确定是否应执行该函数。考虑以下示例:
import streamlit as st
@st.experimental_memo(experimental_allow_widgets=True)
def plus_one(x):
y = x + 1
if st.checkbox("Nuke the value 💥"):
st.write("Value was nuked, returning 0")
y = 0
return y
st.write(plus_one(2))
plus_one
函数接受一个整数 x
作为输入,并返回 x + 1
。该函数还包含一个复选框小部件,用于“清除” x
的值。即 plus_one
的返回值取决于复选框的状态:如果选中,函数返回 0
,否则返回 3
。
为了知道缓存应该返回哪个值(在缓存命中的情况下),Streamlit 将复选框状态(选中 / 未选中)视为函数 plus_one
的额外输入(就像 x
一样)。如果用户选中复选框(从而改变其状态),我们会查找具有相同 x
值(2)和相同复选框状态(选中)的缓存。如果缓存包含此输入组合的值,我们则返回它。否则,我们执行函数并将结果存储在缓存中。
现在让我们了解启用和禁用小部件重放如何改变函数的行为。
Widget replay disabled
- 缓存函数中的小部件会抛出
CachedStFunctionWarning
并被忽略。 - 缓存函数中的其他静态元素按预期回放。
Widget replay enabled
- 缓存函数中的小部件不会导致警告,并且会按预期重放。
- 在缓存函数中与小组件交互将导致函数再次执行,并更新缓存。
- 缓存函数中的小部件在重新运行时保持其状态。
- 每个小部件值的唯一组合被视为函数的单独输入,并用于确定是否应执行该函数。即每个小部件值的唯一组合都有自己的缓存条目;缓存的函数在第一次运行时执行,之后使用保存的值。
- 在一个脚本运行中多次调用具有相同参数的缓存函数会触发
DuplicateWidgetID
错误。 - 如果缓存函数的参数发生变化,从该函数重新渲染的小部件将保留其状态。
- 更改缓存函数的源代码会使缓存失效。
- 无论是
st.experimental_memo
还是st.experimental_singleton
都支持小部件重放。 - 基本上,当函数被
@st.experimental_memo
或@st.experimental_singleton
装饰时,其中包含(支持的)小部件的函数行为不会改变。唯一的区别是,只有在检测到缓存“未命中”时才会执行该函数。
Supported widgets
所有输入小部件都支持在缓存装饰的函数中使用。以下是支持的小部件的详尽列表:
st.button
st.camera_input
st.checkbox
st.color_picker
st.date_input
st.download_button
st.file_uploader
st.multiselect
st.number_input
st.radio
st.selectbox
st.select_slider
st.slider
st.text_area
st.text_input
st.time_input
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。