PPTX-Python `insert_chart` 逐渐减速
PPTX-Python `insert_chart` incrementally slowing down
我们有一个创建包含 1000 多张幻灯片的大型 pptx 的应用程序,我们正在使用 python-pptx
库。
我们遇到的问题是,随着演示文稿的增长,向其中添加元素 and/or 图表变得越来越慢。
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 循环并将变量加载到内存中的方式?
这似乎是图表和幻灯片部件名称分配中的 O(N^2) 行为。 GitHub 问题线程中的更多详细信息:https://github.com/scanny/python-pptx/issues/644#issuecomment-685056215
所以我所做的是,在每次循环迭代中,我在 self.partnames
中创建新的 key
对应于 /ppt/<something>
之后收到的 tmpl
并递增 1
,这不需要每次都遍历所有零件名称并确定 next partname is available
.
是什么
def next_partname(self, tmpl):
"""
Return a |PackURI| instance representing the next partname
matching *tmpl*, which is a printf (%)-style template string
containing a single replacement item, a '%d' to be used to insert the
integer portion of the partname. Example: '/ppt/slides/slide%d.xml'
"""
name = tmpl.split(os.sep)[2]
self.partnames[name] += 1
candidate_partname = tmpl % self.partnames[name]
return PackURI(candidate_partname)
我知道它可以进一步改进,只是需要一些关于我可能遗漏的提示。
我们有一个创建包含 1000 多张幻灯片的大型 pptx 的应用程序,我们正在使用 python-pptx
库。
我们遇到的问题是,随着演示文稿的增长,向其中添加元素 and/or 图表变得越来越慢。
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 循环并将变量加载到内存中的方式?
这似乎是图表和幻灯片部件名称分配中的 O(N^2) 行为。 GitHub 问题线程中的更多详细信息:https://github.com/scanny/python-pptx/issues/644#issuecomment-685056215
所以我所做的是,在每次循环迭代中,我在 self.partnames
中创建新的 key
对应于 /ppt/<something>
之后收到的 tmpl
并递增 1
,这不需要每次都遍历所有零件名称并确定 next partname is available
.
def next_partname(self, tmpl):
"""
Return a |PackURI| instance representing the next partname
matching *tmpl*, which is a printf (%)-style template string
containing a single replacement item, a '%d' to be used to insert the
integer portion of the partname. Example: '/ppt/slides/slide%d.xml'
"""
name = tmpl.split(os.sep)[2]
self.partnames[name] += 1
candidate_partname = tmpl % self.partnames[name]
return PackURI(candidate_partname)
我知道它可以进一步改进,只是需要一些关于我可能遗漏的提示。