最终,在不知道代码的哪一部分运行缓慢(以及实际加载了多少数据)的情况下,很难给出具体的建议。看起来您正在从电子表格中加载 100,000 行。这可能包含大量数据,尤其是在这些行本身很大的情况下。
一些事情要尝试:
- 围绕代码块添加一些性能检测,以找出运行缓慢的内容。这可以像
time.time()
在一段代码之前和之后调用一样简单,并输出两个值之间的差异:
import contextlib
import time
import pandas as pd
import streamlit as st
@contextlib.contextmanager
def profile(name):
start_time = time.time()
yield # <-- your code will execute here
total_time = time.time() - start_time
print("%s: %.4f ms" % (name, total_time * 1000.0))
with profile("load_data"):
df = pd.read_excel('materials.xlsx',nrows=100000)
with profile("create_multiselect"):
species = st.multiselect('SELECT THE MATERIAL', df['Name'])
with profile("filter_on_name"):
new_df = df[(df['Name'].isin(species))]
@st.cache
将注释更改为@st.cache(allow_output_mutation=True)
。这将使 Streamlit 避免散列函数的输出(这是一个巨大的数据帧,可能需要一段时间才能散列)。
- 是否可以一次加载更少的行?
- 或者,您能否避免加载每一行中的所有数据?(例如,您需要“同义词”列吗?)
pandas.read_excel
采用一个usecols
参数,可以限制哪些列被解析。
- 如果您确实需要加载所有这些数据,您能否以允许更快过滤的方式存储它?例如,看起来 pandas 可以与 SQLite 交互。您能否在应用程序首次运行时将您的 excel 数据加载到 SQLite 数据库中,然后针对该数据库而不是针对 DataFrame 执行查询?