我们有一个应用程序可以创建包含超过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, y, cx, cy, chart_data
)
print(str(idx))
prs.save('test.pptx')
我想知道以前是否有人遇到过这种情况?似乎pptx-python必须在Presentation内部进行查找,从而使每次迭代速度变慢。还是我们使用python循环并将变量加载到内存中的方式?
答案 0 :(得分:1)
这似乎是图表和幻灯片零件名分配中的O(N ^ 2)行为。此处的GitHub问题线程中有更多详细信息:https://github.com/scanny/python-pptx/issues/644#issuecomment-685056215
答案 1 :(得分:1)
所以我要做的是,在每次循环迭代中,我都在key
中创建新的self.partnames
,对应于收到的tmpl
之后的/ppt/<something>
并递增{{1 }},并不需要每次都遍历所有部件名称并确定1
是什么。
next partname is available
我知道它可以进一步改进,只需要一些有关我可能错过的内容的提示即可。