PPTXPython`insert_chart`逐渐变慢

2024-05-23 15:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个应用程序创建了包含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似乎必须在演示文稿内部进行查找,从而使每次迭代的速度变慢。还是我们使用python循环并将变量加载到内存中的方式


Tags: fromimportadddatachartpresentation速度slide
2条回答

因此,我所做的是,在每次循环迭代中,我在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)

我知道,它可以进一步改进,只是需要一些提示,我可能错过了什么

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

相关问题 更多 >