matplotlib:更快的PDF生成?

2024-03-28 18:37:50 发布

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

我想用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秒(现代的Intel平台,我尝试了MacOSX和Linux系统)。

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


Tags: 文件inimportfor技巧pdfmatplotlibfig
3条回答

Matplotlib在创建图形等方面有很多开销,甚至在保存到pdf之前也是如此。因此,如果你的绘图相似,你可以通过重用元素来保护很多“设置”,就像你在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")

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

^{pr2}$

对我来说,这个速度几乎是初始示例的两倍。这只是一个选项,如果你做了相似的情节,但如果他们非常相似,它可以加快很多事情。matplotlib animation examples可能对这种优化有启发。在

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

注意:以下代码将在您机器上的当前目录中生成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个核心上做了这个(双核超调),得到了显著的提升:

^{pr2}$

我确信mpl的pdf后端有很多性能改进的空间,但这并不是您所追求的时间尺度。在

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

相关问题 更多 >