10

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プラットフォームでは、Mac OS XとLinuxシステムの両方を試しました)。

matplotlibでPDF生成を高速化するために使用できるトリックやテクニックはありますか?もちろん、マルチコアプラットフォームで複数の並列スレッドを使用できますが、他にできることはありますか?

4

4 に答える 4

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()

完全にスケーリングするわけではありませんが、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、

于 2012-08-19T14:45:15.433 に答える
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")

これはそれほど役に立たないことに注意してください。次の行を再利用することで、かなり節約できます。

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")

これは、私にとって最初の例の2倍近くの速さです。これは、同様のプロットを行う場合の唯一のオプションですが、非常に類似している場合は、処理を大幅に高速化できます。matplotlibアニメーションの例は、この種の最適化のインスピレーションになる可能性があります。

于 2012-08-26T14:15:56.213 に答える
0

レポートラボを使用できます。オープンソースバージョンは、あなたがやろうとしていることを行うのに十分なはずです。matplotlibを使用してPDFを生成するよりもはるかに高速であるはずです。

于 2012-08-19T13:18:03.247 に答える
0

ライブラリ(matplotlib)を変更することは、実際にはmatplotlibが生成するものが好きなので、オプションではないと思います:-)。また、matplotlibの他のバックエンドはそれほど高速ではないと思います-そしてここの何人かの人々はすでにこれについてコメントしています-。マシンごとに多くのコアがあり、優れたタスクスケジューラを備えたオペレーティングシステムの最近では、スループット、つまりPDFファイルの作成速度を最適化するために、あなたのようなジョブを並行して実行するのは問題ないと思います。適度な計算能力で、毎秒大量のファイルを作成できると思います。これ進むべき道なので、あなたの質問は非常に興味深いものであると正直に信じていますが、実際にはあまり関係がありません。

于 2012-08-30T14:35:14.687 に答える