ホームページ >バックエンド開発 >Python チュートリアル >Matplotlib でプロットするとパフォーマンスが低下するのはなぜですか?また、何ができるでしょうか?

Matplotlib でプロットするとパフォーマンスが低下するのはなぜですか?また、何ができるでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-19 20:47:30203ブラウズ

When Plotting with Matplotlib, Why Does Performance Suffer and What Can Be Done?

Matplotlib プロットのパフォーマンスに関する考慮事項

さまざまな Python プロット ライブラリを評価する際、Matplotlib の使用時にパフォーマンスの問題が発生する可能性があります。この記事では、Matplotlib のプロットが遅い理由を検討し、その速度を改善するための解決策を提供します。

遅さの原因

Matplotlib のパフォーマンスの低下は、主に次の 2 つの要因に起因します。

  • 頻繁な再描画: fig.canvas.draw() が呼び出されるたびに、軸の境界や目盛りラベルなどの要素を含む Figure 全体が更新されます。このプロセスは計算負荷が高くなります。
  • 多数のサブプロット: 多くの目盛ラベルを特徴とする複数のサブプロットを含むプロットでは、レンダリングが大幅に遅くなる可能性があります。

パフォーマンスの向上

パフォーマンスを向上させるには、次の戦略を検討してください。

1.ブリッティングを使用する:

ブリッティングでは、Figure 全体を再描画するのではなく、キャンバスの特定の部分を更新するだけです。これにより、計算オーバーヘッドが大幅に削減されます。 Matplotlib は、使用される GUI フレームワークに応じて異なるバックエンド固有のブリッティング メソッドを提供します。

2.再描画の制限:

プロット時にanimated=Trueオプションを使用します。この手法を Matplotlib アニメーション モジュールと組み合わせると、キャンバス全体の再描画をトリガーせずに特定のオブジェクトを更新できます。

3.サブプロットのカスタマイズ:

サブプロットと目盛りラベルの数を最小限に抑えます。不要な要素を削除してレンダリング時間を短縮します。

4.コード効率の向上:

コードをリファクタリングして構造を改善し、実行される操作の数を減らします。可能な場合は、ベクトル化された操作を利用します。

例:

これは、copy_from_bbox とrestore_region によるブリッティングを使用した、質問で提供されたコードの最適化されたバージョンです:

<code class="python">import matplotlib.pyplot as plt
import numpy as np
import time

x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)

fig, axes = plt.subplots(nrows=6)
fig.show()  # Draw the canvas initially

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'p-']
lines = [ax.plot(x, y, style)[0] for ax, style in zip(axes, styles)]

# Store background images of the axes
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

tstart = time.time()               
for i in range(1, 200):
    for j, line in enumerate(lines, start=1):
        # Restore the background
        fig.canvas.restore_region(backgrounds[j-1])
        
        # Update the data
        line.set_ydata(sin(j*x+i/10.0))  

        # Draw the artist and blit
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

print('FPS:', 200/(time.time()-tstart))</code>

代替ライブラリ

Matplotlib のパフォーマンスが依然として満足できない場合は、BokehPlotly、または などの代替プロット ライブラリを検討してください。アルタイル。これらのライブラリは、リアルタイムの対話性とパフォーマンスの最適化を優先します。

以上がMatplotlib でプロットするとパフォーマンスが低下するのはなぜですか?また、何ができるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。