如何结合Python上下文管理器与pandas.read_excel优化读取性能?
问题根源与解决方案
核心问题:重复读取Excel文件
你这段代码慢到无法运行的根本原因不是没使用上下文管理器,而是循环里的致命错误:
- 每次循环都调用
fetch_excel(1),等于3000次重复打开、读取整个D001_balance.xlsx文件。Excel读取是IO密集型操作,重复3000次必然导致巨量耗时,甚至可能因为文件句柄耗尽直接崩溃。
关于上下文管理器的疑问
pd.read_excel()内部已经封装了文件的打开与关闭逻辑,不需要额外用with语句包裹,就算加了也不会提升性能——你的问题和文件是否及时关闭无关,完全是重复读取导致的。
优化后的代码
只需要读取一次Excel文件,之后循环直接复用内存里的DataFrame即可:
import pandas as pd import numpy as np def fetch_excel(x): df_x = pd.read_excel(f"D00{x}_balance.xlsx") return df_x # 关键:只读取一次文件,存在变量里 df = fetch_excel(1) T = np.zeros(3000) for i in range(0, 3000): # 直接用已读取的df,不用重新读文件 T[i] = df.iloc[i+18, 0] print(df.iloc[0,0])
进一步优化建议
- 如果只需要表格里的某一列数据,可以在读取时指定
usecols参数,减少内存占用:df = pd.read_excel("D001_balance.xlsx", usecols=[0]) # 只读取第0列 - 可以直接把需要的行批量提取,不用循环赋值:
# 提取第19到3018行的第0列(i+18从18到3017,对应iloc的索引范围) T = df.iloc[18:3018, 0].values - 更换更快的读取引擎:比如用
openpyxl(针对xlsx格式),在读取时指定engine="openpyxl",部分场景下能提升读取速度。
内容的提问来源于stack exchange,提问作者In the blind
相关产品推荐
相关产品推荐

