翻译: 使用 GPT-4 自动诊断Streamlit性能问题

GPT-4 提升Streamlit 应用系列

1. 从缓慢到快速,使用 GPT-4 来提高应用程序性能

Web 应用程序需要足够快。快速的网络应用程序可以让用户满意并回访更多。

加速 Streamlit 应用程序的最佳方法之一是利用缓存方法。简而言之,这些方法通过消除冗余的重新计算来优化性能。

Streamlit 提供两种缓存机制@st.cache_data@st.cache_resource

  • @st.cache_data 非常适合返回 DataFrame 和数组等数据类型的函数。它通过序列化解决突变和并发问题。
  • @st.cache_resource 专为缓存全局资源而定制,例如 ML 模型或数据库连接。

下面我创建了一个具有次优编码的应用程序,导致性能问题:

python 复制代码
import streamlit as st
import pandas as pd
import sqlalchemy as db
import requests
import tensorflow as tf

price = st.number_input("House Price", min_value=100000, max_value=10000000, step=100000)
def load_data():
    return pd.read_csv('large_dataset.csv')
data = load_data()
used_columns = ['Column1', 'Column2', 'Column3']
data = data[used_columns]
def download_model():
    url = "<https://example.com/large-model.h5>"
    response = requests.get(url)
    with open('large-model.h5', 'wb') as f:
        f.write(response.content)
download_model()
model = tf.keras.models.load_model('large-model.h5')
def load_efficient_data():
    return pd.read_parquet('efficient_data.parquet')
efficient_data = load_efficient_data()
database_uri = 'sqlite:///example.db'
engine = db.create_engine(database_uri)
query = "SELECT * FROM large_table WHERE condition = true"
db_data = pd.read_sql_query(query, con=engine)

如果您将此代码粘贴到 ChatGPT 并请求性能改进 --- GPT-4 可以在几秒钟内识别需要改进的领域!

prompt:

请一步一步分析下面代码的性能问题,并提供解决方案

2. 优化输出

提供的代码片段存在多个性能问题,可能会显著影响Streamlit应用程序的效率和响应能力。让我们逐步分析它们并提出解决方案:

2.1. 加载大型数据集

python 复制代码
def load_data():
    return pd.read_csv('large_dataset.csv')
data = load_data()

问题:每次运行脚本都直接使用pd.read_csv()加载大型数据集可能非常低效,特别是对于Streamlit应用程序,因为每次用户输入更改时都会重新运行脚本。

解决方案:使用Streamlit的@st.cache装饰器缓存数据加载函数,以防止在每次交互时重新加载来自CSV文件的数据。

2.2. 冗余数据加载

python 复制代码
used_columns = ['Column1', 'Column2', 'Column3']
data = data[used_columns]

问题:首先加载整个数据集,然后只使用特定列。如果数据集很大,只需要少数列,这是低效的。

解决方案:修改load_data函数,只加载所需的列。

2.3 在每次运行时下载模型

python 复制代码
def download_model():
    url = "<https://example.com/large-model.h5>"
    response = requests.get(url)
    with open('large-model.h5', 'wb') as f:
        f.write(response.content)
download_model()

问题:每次运行脚本时都会从URL下载模型。这是非常低效的,特别是对于大型模型来说。

解决方案:在下载之前检查模型文件是否已经存在。或者,可以使用 @st.cache 装饰器来优化模型下载函数。

2.4. 在每次运行时加载TensorFlow模型

python 复制代码
model = tf.keras.models.load_model('large-model.h5')

问题:加载大型TensorFlow模型可能会耗费时间,并且在每次运行时都要进行加载。

解决方案:使用@st.cache缓存模型加载。

2.5. 低效的数据格式

python 复制代码
def load_efficient_data():
    return pd.read_parquet('efficient_data.parquet')
efficient_data = load_efficient_data()

问题:虽然通常使用Parquet比CSV更高效,但每次加载大文件仍然可能很慢。

解决方案:使用@st.cache缓存Parquet文件的加载。

2.6 数据库查询

python 复制代码
database_uri = 'sqlite:///example.db'
engine = db.create_engine(database_uri)
query = "SELECT * FROM large_table WHERE condition = true"
db_data = pd.read_sql_query(query, con=engine)

问题:每次执行脚本时都会运行数据库查询。这可能会很慢,效率低下,特别是对于大型查询来说。

解决方案:使用 @st.cache 缓存查询结果。还要确保查询经过优化,只获取必要的数据。

3. 应用这些解决方案后,代码可能如下所示:

python 复制代码
import streamlit as st
import pandas as pd
import sqlalchemy as db
import requests
import tensorflow as tf
import os

@st.cache
def load_data():
    return pd.read_csv('large_dataset.csv', usecols=['Column1', 'Column2', 'Column3'])

@st.cache(allow_output_mutation=True)
def download_model(model_url, model_path):
    if not os.path.exists(model_path):
        response = requests.get(model_url)
        with open(model_path, 'wb') as f:
            f.write(response.content)

@st.cache(allow_output_mutation=True)
def load_model(model_path):
    return tf.keras.models.load_model(model_path)

@st.cache
def load_efficient_data():
    return pd.read_parquet('efficient_data.parquet')

@st.cache
def load_db_data(query, engine):
    return pd.read_sql_query(query, con=engine)

price = st.number_input("House Price", min_value=100000, max_value=10000000, step=100000)
data = load_data()

model_url = "<https://example.com/large-model.h5>"
model_path = 'large-model.h5'
download_model(model_url, model_path)
model = load_model(model_path)

efficient_data = load_efficient_data()

database_uri = 'sqlite:///example.db'
engine = db.create_engine(database_uri)
query = "SELECT * FROM large_table WHERE condition = true"
db_data = load_db_data(query, engine)

这个经过修订的代码效率更高,应该会显著提升应用程序的性能。

代码

https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://blog.streamlit.io/take-your-streamlit-apps-to-the-next-level-with-gpt-4/

相关推荐
之歆16 分钟前
Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
笔记·python·学习
麻雀无能为力33 分钟前
CAU数据挖掘 支持向量机
人工智能·支持向量机·数据挖掘·中国农业大学计算机
智能汽车人1 小时前
Robot---能打羽毛球的机器人
人工智能·机器人·强化学习
埃菲尔铁塔_CV算法1 小时前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
ζั͡山 ั͡有扶苏 ั͡✾1 小时前
AI辅助编程工具对比分析:Cursor、Copilot及其他主流选择
人工智能·copilot·cursor
东临碣石821 小时前
【AI论文】数学推理能否提升大型语言模型(LLM)的通用能力?——探究大型语言模型推理能力的可迁移性
人工智能·语言模型·自然语言处理
天天爱吃肉82181 小时前
ZigBee通信技术全解析:从协议栈到底层实现,全方位解读物联网核心无线技术
python·嵌入式硬件·物联网·servlet
未来智慧谷1 小时前
微软医疗AI诊断系统发布 多智能体协作实现疑难病例分析
人工智能·microsoft·医疗ai
野生技术架构师1 小时前
简述MCP的原理-AI时代的USB接口
人工智能·microsoft
Allen_LVyingbo2 小时前
Python常用医疗AI库以及案例解析(2025年版、上)
开发语言·人工智能·python·学习·健康医疗