PPTX-Python`insert_chart`逐渐变慢

问题描述

我们有一个应用程序可以创建包含超过1000张幻灯片的大型pptx,并且我们正在使用python-pptx库。

我们面临的问题是,随着演示文稿的增长,向其中添加元素和/或图表变得越来越慢。

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches


SLD_LAYOUT_TITLE_AND_CONTENT = 1

prs = Presentation()

slide_layout = prs.slide_layouts[SLD_LAYOUT_TITLE_AND_CONTENT]
for idx in range(2000):
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    
    chart_data = CategoryChartData()
    chart_data.categories = ['East','West','Midwest']
    chart_data.add_series('Series 1',(19.2,21.4,16.7))

    x,y,cx,cy = Inches(2),Inches(2),Inches(6),Inches(4.5)
    slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED,x,cy,chart_data
    )

    print(str(idx))

prs.save('test.pptx')

我想知道以前是否有人遇到过这种情况?似乎pptx-python必须在Presentation内部进行查找,从而使每次迭代速度变慢。还是我们使用python循环并将变量加载到内存中的方式?

解决方法

这似乎是图表和幻灯片零件名分配中的O(N ^ 2)行为。此处的GitHub问题线程中有更多详细信息:https://github.com/scanny/python-pptx/issues/644#issuecomment-685056215

,

所以我要做的是,在每次循环迭代中,我都在key中创建新的self.partnames,对应于收到的tmpl之后的/ppt/<something>并递增{{1 }},并不需要每次都遍历所有部件名称并确定1是什么。

next partname is available

我知道它可以进一步改进,只需要一些有关我可能错过的内容的提示即可。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...