priority_high

重要

这是一个实验性功能。实验性功能及其API可能会随时更改或删除。要了解更多信息,请点击这里

priority_high

警告

此方法在Streamlit的1.41.0版本中不存在。

持久化备忘录缓存目前不支持TTL。如果指定了persistttl将被忽略:

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.
priority_high

警告

此方法在Streamlit的1.41.0版本中不存在。

示例

在下面的示例中,按下“清除所有”按钮将清除所有使用@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.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

除了静态元素外,使用@st.experimental_memo装饰的函数也可以包含输入小部件!默认情况下,重放输入小部件是禁用的。要启用它,您可以将@st.experimental_memoexperimental_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()

让我们揭开缓存装饰函数中小部件重放的神秘面纱,并对其概念有一个理解。小部件的值被视为函数的额外输入,并用于确定是否应执行该函数。考虑以下示例:

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)和相同复选框状态(选中)的缓存。如果缓存包含此输入组合的值,我们则返回它。否则,我们执行函数并将结果存储在缓存中。

现在让我们了解启用和禁用小部件重放如何改变函数的行为。

  • 缓存函数中的小部件会抛出CachedStFunctionWarning并被忽略。
  • 缓存函数中的其他静态元素按预期回放。
  • 缓存函数中的小部件不会导致警告,并且会按预期重放。
  • 在缓存函数中与小组件交互将导致函数再次执行,并更新缓存。
  • 缓存函数中的小部件在重新运行时保持其状态。
  • 每个小部件值的唯一组合被视为函数的单独输入,并用于确定是否应执行该函数。即每个小部件值的唯一组合都有自己的缓存条目;缓存的函数在第一次运行时执行,之后使用保存的值。
  • 在一个脚本运行中多次调用具有相同参数的缓存函数会触发DuplicateWidgetID错误。
  • 如果缓存函数的参数发生变化,从该函数重新渲染的小部件将保留其状态。
  • 更改缓存函数的源代码会使缓存失效。
  • 无论是 st.experimental_memo 还是 st.experimental_singleton 都支持小部件重放。
  • 基本上,当函数被@st.experimental_memo@st.experimental_singleton装饰时,其中包含(支持的)小部件的函数行为不会改变。唯一的区别是,只有在检测到缓存“未命中”时才会执行该函数。

所有输入小部件都支持在缓存装饰的函数中使用。以下是支持的小部件的详尽列表:

  • 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
forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。