Python代码运行耗时优化求助:600工作表Excel合并代码耗时8小时
优化Excel多工作表合并代码的建议
哇,600个工作表合并花8小时确实太磨人了!我帮你分析下原代码的性能瓶颈,再给出具体的优化方案,应该能大幅缩短耗时:
核心性能瓶颈分析
你的代码里最影响速度的问题是重复打开Excel文件:你先用xlrd.open_workbook打开了文件,但每次循环又调用pd.read_excel(file, sheet_name),这会让pandas每次都重新读取整个Excel文件,600次重复的磁盘IO操作直接拖慢了速度。
具体优化措施
- 一次性打开文件,避免重复IO:用
pd.ExcelFile一次性加载整个Excel工作簿,之后直接从这个对象里读取各个工作表,这样只需要打开一次文件,能节省大量磁盘读取时间。 - 指定高效的读取/写入引擎:针对
.xlsx格式,使用openpyxl引擎(需要提前安装:pip install openpyxl),比默认引擎的读取速度更快;写入时也指定该引擎,提升输出效率。 - 优化数据类型,减少内存占用:读取时通过
dtype参数指定更紧凑的数据类型(比如把重复率高的字符串列设为category,数值列用int32/float32代替默认的int64/float64),降低内存消耗的同时,合并和处理速度也会提升。 - 边读边合并,减少内存压力:不用把所有DataFrame都存在列表里再一次性concat,而是读取一个工作表就合并一次,避免内存占用过高(尤其适合单表数据量大的场景)。
- 用
with语句管理ExcelWriter:自动处理文件的打开和关闭,避免资源泄漏,同时代码更简洁。
优化后的代码示例
import pandas as pd # 一次性加载整个工作簿,避免重复打开 file_path = r'C:\Users\Taqwa\Desktop\stations\9575_output.xlsx' with pd.ExcelFile(file_path, engine='openpyxl') as xls: # 初始化空的DataFrame merged_df = pd.DataFrame() for sheet_name in xls.sheet_names: # 从已加载的ExcelFile中读取工作表,可根据实际情况指定dtype优化内存 # 示例:dtype={'station_id': 'int32', 'location': 'category', 'value': 'float32'} df = pd.read_excel(xls, sheet_name=sheet_name) # 边读边合并,ignore_index避免索引混乱 merged_df = pd.concat([merged_df, df], axis=0, ignore_index=True) # 写入合并后的文件,使用openpyxl引擎 output_path = r'C:\Users\Taqwa\Desktop\stations\9575_output_Concat.xlsx' with pd.ExcelWriter(output_path, engine='openpyxl') as writer: merged_df.to_excel(writer, sheet_name='9575Contatenated', index=False)
额外提速建议
- 如果Excel文件里有很多无关格式(比如样式、图表),可以用
usecols参数只读取需要的列,减少不必要的数据加载。 - 若不需要最终输出为Excel格式,输出成CSV会比Excel快很多,后续如果需要再转Excel即可。
- 要是高性能计算机有多核,可尝试用
multiprocessing并行读取工作表(注意:Excel文件存在并发读取锁问题,可能需要先拆分文件或用其他方式规避)。
内容的提问来源于stack exchange,提问作者Taqwa Hadidi
相关产品推荐
相关产品推荐

