matplotlib:更快的PDF生成?

Juk*_*ela 8 python pdf-generation matplotlib

我想用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")
Run Code Online (Sandbox Code Playgroud)

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

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

pel*_*son 4

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

注意:以下代码将在您计算机上的当前目录中生成 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()
Run Code Online (Sandbox Code Playgroud)

它无法完美扩展,但通过在 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
Run Code Online (Sandbox Code Playgroud)

我确信 mpl 的 pdf 后端的性能改进还有很大的空间,但这不在您所追求的时间范围内。

哈特哈,