You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:39:12