Matplotlib プロットを高速化してパフォーマンスを向上させる方法?

Susan Sarandon
リリース: 2024-10-19 20:48:29
オリジナル
977 人が閲覧しました

How to Speed Up Matplotlib Plotting to Enhance Performance?

Matplotlib はなぜ遅いですか?

Python プロット ライブラリを評価するときは、パフォーマンスを考慮することが重要です。広く使用されているライブラリである Matplotlib は動作が遅いように見える場合があり、高速化や代替オプションの検討について疑問が生じます。問題を深く掘り下げ、考えられる解決策を検討してみましょう。

提供された例では、複数のサブプロットとデータ更新を含むプロットを示しています。 Matplotlib を使用すると、このプロセスには軸の境界や目盛りラベルを含むすべての再描画が含まれるため、パフォーマンスが低下します。

ボトルネックを理解する

速度の低下には、次の 2 つの重要な要素が影響します。

  1. 過剰な再描画: Matplotlib の fig.canvas.draw() 関数は、更新が必要なのはごく一部の場合でも、Figure 全体を再描画します。
  2. 豊富な目盛りラベル: 多数の目盛りラベルとサブプロットは、描画プロセスに大きな負担をかける可能性があります。

ブリッティングによる最適化

これらのボトルネックに対処するには、ブリッティングの使用を検討してください。ブリッティングでは、Figure の特定の部分のみを更新し、レンダリング時間を短縮します。ただし、効率的な実装にはバックエンド固有のコードが必要であり、GUI ツールキット内に Matplotlib プロットを埋め込む必要がある場合があります。

GUI 中立ブリッティング

GUI 中立ブリッティングこの技術は、バックエンドに依存せずに適切なパフォーマンスを提供できます:

  1. 背景のキャプチャ: アニメーションの前に、後で復元するために各サブプロットの背景をキャプチャします。
  2. 更新そして描画: フレームごとに、線のデータとアーティストを更新し、背景を復元し、更新された部分をブリッティングします。
  3. 再描画の回避: fig.canvas.blit( fig.canvas.draw() の代わりに ax.bbox) を使用して、必要な領域のみを更新します。

実装例:

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

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

fig, axes = plt.subplots(nrows=6)

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
    return ax.plot(x, y, style, animated=True)[0]

lines = [plot(ax, style) for ax, style in zip(axes, styles)]

# Capture Background
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

for i in xrange(1, 2000):
    for j, (line, ax, background) in enumerate(zip(lines, axes, backgrounds), start=1):
        fig.canvas.restore_region(background)
        line.set_ydata(np.sin(j*x + i/10.0))
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)</code>
ログイン後にコピー

アニメーション モジュール

最近の Matplotlib バージョンには、ブリッティングを簡略化するアニメーション モジュールが含まれています:

<code class="python">import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(i):
    for j, line in enumerate(lines, start=1):
        line.set_ydata(np.sin(j*x + i/10.0))

ani = animation.FuncAnimation(fig, animate, xrange(1, 200), interval=0, blit=True)</code>
ログイン後にコピー

以上がMatplotlib プロットを高速化してパフォーマンスを向上させる方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!