如何提升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
相关产品推荐
相关产品推荐

