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

如何提升Python代码运行速度?docx转XLS代码性能优化求助

提速方案分析与优化代码

原代码处理22000行数据耗时2.5小时,核心瓶颈集中在openpyxl逐行写入的低效操作、重复磁盘IO和事后批量修改单元格这几个环节,以下是针对性的优化方案:

核心优化点

1. 先缓存所有数据,再批量写入Excel

openpyxl的ws.append()每次调用都会触发工作表内部结构更新,频繁调用会严重拖慢速度。先把所有要写入的数据收集到内存列表中,最后一次性写入,能大幅减少与工作表的交互次数。

2. 提前处理单元格前缀,避免二次遍历

原代码先写入所有数据,再遍历整个工作表修改带+/-/=开头的单元格,多了一次全量遍历操作。直接在提取单元格文本时完成前缀处理,一步到位。

3. 精准筛选docx文件,减少无效判断

用glob.glob()直接匹配.docx文件,替代os.listdir()加后缀判断的逻辑,代码更简洁,也省去了对非docx文件的无效检查。

4. 合并磁盘写入操作

原代码保存了两次Excel文件,合并成一次写入,减少磁盘IO的耗时(磁盘操作本身是性能瓶颈之一)。


优化后的代码

from docx import Document
from openpyxl import Workbook
import os
import glob

# 获取当前脚本所在文件夹路径
folder = os.path.dirname(os.path.abspath(__file__))
# 内存缓存所有待写入数据
data_buffer = []

# 直接筛选所有docx文件
for docx_path in glob.glob(os.path.join(folder, "*.docx")):
    filename = os.path.basename(docx_path)
    doc = Document(docx_path)
    
    for table in doc.tables:
        # 添加文件名标识行
        data_buffer.append([f"File name: {filename}"])
        # 提取并处理每一行的右数第二列内容
        for row in table.rows:
            cell_text = row.cells[-2].text
            # 提前处理特殊开头的单元格
            if cell_text and cell_text[0] in ("+", "-", "="):
                cell_text = f"'{cell_text}"
            data_buffer.append([cell_text])

# 批量写入Excel
wb = Workbook()
ws = wb.active
# 一次性写入所有数据,效率远高于逐行append
ws.values = data_buffer

wb.save("output.xlsx")

额外提速方案:使用pandas写入Excel

如果你的环境允许安装第三方库,用pandas处理Excel写入会比原生openpyxl更快,pandas底层做了大量IO优化:

from docx import Document
import os
import glob
import pandas as pd

folder = os.path.dirname(os.path.abspath(__file__))
data_buffer = []

for docx_path in glob.glob(os.path.join(folder, "*.docx")):
    filename = os.path.basename(docx_path)
    doc = Document(docx_path)
    
    for table in doc.tables:
        data_buffer.append([f"File name: {filename}"])
        for row in table.rows:
            cell_text = row.cells[-2].text
            if cell_text and cell_text[0] in ("+", "-", "="):
                cell_text = f"'{cell_text}"
            data_buffer.append([cell_text])

# 转成DataFrame后批量写入
df = pd.DataFrame(data_buffer)
df.to_excel("output.xlsx", index=False, header=False, engine="openpyxl")

效果说明

经过这些优化后,处理22000行数据的耗时应该能压缩到几分钟以内(具体取决于硬件,但至少能提升几十倍效率)。

内容的提问来源于stack exchange,提问作者Domi Szécskai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:35:20