Python自定义函数循环调用时如何避免重复读取Excel文件?
性能优化方案
你的性能瓶颈来源于循环内重复执行磁盘IO操作(读取Excel),磁盘IO的速度远低于内存读写,只需将Excel读取操作移到循环外执行一次,把数据集存储在内存中,后续所有函数调用直接读取内存中的对象即可解决效率问题。
实现方案
方案1:存储为Pandas DataFrame(适配大多数查询、插值场景)
- 程序初始化阶段仅读取一次Excel,存入DataFrame:
import pandas as pd # 全局仅执行一次 excel_df = pd.read_excel("你的Excel文件路径.xlsx") # 可提前完成数据清洗,避免后续重复处理 excel_df = excel_df.dropna(subset=["你需要用到的4个变量列名", "目标值列名"]).astype(float)
- 改造你的计算函数,直接接收DataFrame作为入参:
def calc_interpolation(var1: float, var2: float, var3: float, var4: float, data: pd.DataFrame): # 此处写入你原本的查询、插值逻辑,直接使用传入的data操作,无需再读Excel return 计算结果
- 循环调用时直接传入已加载好的DataFrame:
result_list = [] for _ in range(1000): # 每次获取4个输入变量的实际值 res = calc_interpolation(v1, v2, v3, v4, excel_df) result_list.append(res)
方案2:存储为NumPy数组(适配纯数值插值、对速度要求更高的场景)
如果你的插值逻辑为纯数值运算,可提前将DataFrame转为NumPy数组存储,读写速度更快:
# 初始化阶段执行一次 excel_df = pd.read_excel("你的Excel文件路径.xlsx") # 提取需要用到的列转为数组,减少冗余数据占用 data_array = excel_df[["变量1列", "变量2列", "变量3列", "变量4列", "目标值列"]].to_numpy()
后续函数直接操作data_array做数值计算即可。
额外优化建议
- 如果Excel文件体积较大,首次读取耗时久,可在首次读取后将DataFrame序列化为pickle格式存储,后续程序启动直接读取pickle文件,速度比读取Excel快3~10倍:
# 首次读取Excel后存储缓存文件,仅执行一次 excel_df.to_pickle("excel_data_cache.pkl") # 后续程序启动直接读取缓存 excel_df = pd.read_pickle("excel_data_cache.pkl") - 如果存在重复的4个变量输入组合,可给计算函数加
functools.lru_cache装饰器做内存缓存,相同参数无需重复计算。
内容的提问来源于stack exchange,提问作者Durlabh
相关产品推荐
相关产品推荐

