You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用python-docx插入900张Word图片速度过慢,求高效方案

高效批量插入图片到Word文档底部(针对python-docx)

问题拆解

你之前的方案因为重复遍历文档结构(每次插入图片都要扫一遍所有表格、行、单元格),处理900张图时会产生大量冗余操作,这是速度慢的核心原因。既然现在改成直接把图片追加到文档底部,我们可以完全抛弃原来的标签替换逻辑,用更直接高效的方式实现。

优化后的代码实现

下面是针对需求优化后的代码,去掉了所有不必要的嵌套遍历,直接批量插入图片:

import docx
import os
from docx.shared import Inches

# 初始化Word文档
document = docx.Document("./" + template)

# 高效获取目标图片路径(用os.scandir比os.listdir更快,适合大量文件)
polar_dir = "./plots/polar"
polar_image_paths = []
with os.scandir(polar_dir) as entries:
    for entry in entries:
        # 过滤掉文件夹和包含"foundation"的文件
        if entry.is_file() and "foundation" not in entry.name:
            polar_image_paths.append(os.path.join(polar_dir, entry.name))

# 统一设置图片宽度(避免循环中重复创建Inches对象)
img_width = Inches(3)

# 批量插入图片到文档底部
for img_path in polar_image_paths:
    # 新增段落放置图片(保证每张图片独立分段,排版更整洁)
    para = document.add_paragraph()
    run = para.add_run()
    run.add_picture(img_path, width=img_width)

# 保存最终文档
document.save(out_file)

关键优化点说明

  1. 移除冗余遍历:彻底删掉了原来遍历表格替换标签的逻辑,直接对图片列表做一次遍历,时间复杂度从O(n*m)降到O(n)(n为图片数量)。
  2. IO效率提升:用os.scandir替代os.listdir,它在处理大量文件时性能更优,因为返回的DirEntry对象可以直接获取文件属性,减少额外的系统调用。
  3. 减少对象重复创建:提前定义img_width,避免在循环中重复生成Inches实例,节省内存和CPU开销。
  4. 简化逻辑:直接追加图片到文档末尾,不需要再维护标签与图片的映射字典(如果不需要保留原来的标签关联,这部分可以完全去掉)。

额外建议

如果你的图片文件非常大(单张几十MB),900张可能会占用较多内存,这时可以考虑分批插入+保存:比如每插入100张就保存一次文档,然后重新打开继续插入(不过python-docx对文档的增量修改支持有限,这种情况可能需要调整逻辑,比如先创建多个小文档,最后合并,但一般900张普通尺寸的图内存是能承受的)。

内容的提问来源于stack exchange,提问作者Ipa

火山引擎 最新活动