matplotlib:更快的PDF生成?

时间:2012-08-19 13:06:44

标签: python matplotlib pdf-generation

我想使用matplotlib生成大量PDF文件。我的主要问题是matplotlib很慢,每个文件需要0.5秒。

我试图弄清楚为什么需要这么长时间,我编写了以下测试程序,它只是将一条非常简单的曲线绘制为PDF文件:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

X = range(10)
Y = [ x**2 for x in X ]

for n in range(100):
    fig = plt.figure(figsize=(6,6))
    ax = fig.add_subplot(111)
    ax.plot(X, Y)
    fig.savefig("test.pdf")

但即使是这样简单的事情也需要花费大量时间:100个PDF文件共计15-20秒(现代英特尔平台,我尝试过Mac OS X和Linux系统)。

我是否可以使用任何技巧和技巧来加速matplotlib中的PDF生成?显然我可以在多核平台上使用多个并行线程,但还有什么我可以做的吗?

4 个答案:

答案 0 :(得分:3)

如果实用,您可以使用多进程来执行此操作(假设您的计算机上有多个核心):

注意:以下代码将在您计算机的当前目录中生成40个pdf

import matplotlib.pyplot as plt

import multiprocessing


def do_plot(y_pos):
    fig = plt.figure()
    ax = plt.axes()
    ax.axhline(y_pos)
    fig.savefig('%s.pdf' % y_pos)

pool = multiprocessing.Pool()

for i in xrange(40):
    pool.apply_async(do_plot, [i])

pool.close()
pool.join()

它不能很好地扩展,但是通过在我的4核(具有高强度的双核)上执行此操作,我获得了显着的提升:

$> time python multi_pool_1.py 
done

real    0m5.218s
user    0m4.901s
sys 0m0.205s

$> time python multi_pool_n.py 
done

real    0m2.935s
user    0m9.022s
sys 0m0.420s

我确信在mpl的pdf后端有很多性能改进的余地,但这并不是你所追求的时间表。

HTH,

答案 1 :(得分:3)

即使在将其保存为pdf之前,Matplotlib也有很多创建图形的开销。因此,如果您的情节类似,您可以通过重复使用元素来安全地进行“设置”,就像您在matplotlib的动画示例中找到的一样。

您可以在此示例中重复使用图形和轴:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

X = range(10)
Y = [ x**2 for x in X ]
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111)


for n in range(100):
    ax.clear() # or even better just line.remove()
               # but should interfere with autoscaling see also below about that
    line = ax.plot(X, Y)[0]
    fig.savefig("test.pdf")

请注意,这并没有多大帮助。通过重复使用以下行,您可以节省更多:

line = ax.plot(X, Y)[0]
for n in range(100):
    # Now instead of plotting, we update the current line:
    line.set_xdata(X)
    line.set_ydata(Y)
    # If autoscaling is necessary:
    ax.relim()
    ax.autoscale()

    fig.savefig("test.pdf")

这比我最初的例子快两倍。这只是一个选项,如果你做类似的情节,但如果它们非常相似,它可以加速很多事情。 matplotlib animation examples可能会为这种优化提供灵感。

答案 2 :(得分:0)

您可以使用Report Lab。开源版本应该足以完成你想要做的事情。它应该比使用matplotlib生成pdfs快得多。

答案 3 :(得分:0)

我认为更改库(matplotlib)对你来说不是一个选项,因为你实际上喜欢matplotlib产生的东西:-)。我还假设 - 这里的一些人已经对此发表了评论 - matplotlib的其他后端并没有明显更快。我认为在这些日子里,每台机器和操作系统有很多核心,并且具有良好的任务调度程序,可以并行运行像你这样的工作,以优化吞吐量,即创建PDF文件的速度。我认为你能够以合理的计算能力每秒产生大量文件。这的方法,所以我真的相信你的问题非常有趣,但在实践中却没有真正的相关性。