„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann das Plotten von Matplotlib beschleunigt werden, um die Leistung zu verbessern?

Wie kann das Plotten von Matplotlib beschleunigt werden, um die Leistung zu verbessern?

Veröffentlicht am 06.11.2024
Durchsuche:207

How to Speed Up Matplotlib Plotting to Enhance Performance?

Warum ist Matplotlib so langsam?

Bei der Bewertung von Python-Plotbibliotheken ist es wichtig, die Leistung zu berücksichtigen. Matplotlib, eine weit verbreitete Bibliothek, kann träge wirken und Fragen zur Beschleunigung oder Erforschung alternativer Optionen aufwerfen. Lassen Sie uns in das Problem eintauchen und mögliche Lösungen erkunden.

Das bereitgestellte Beispiel zeigt eine Handlung mit mehreren Unterhandlungen und Datenaktualisierungen. Bei Matplotlib umfasst dieser Prozess das Neuzeichnen aller Elemente, einschließlich Achsengrenzen und Teilstrichbeschriftungen, was zu einer langsamen Leistung führt.

Die Engpässe verstehen

Zwei Schlüsselfaktoren tragen zur Langsamkeit bei:

  1. Übermäßiges Neuzeichnen: Die Funktion fig.canvas.draw() von Matplotlib zeichnet die gesamte Figur neu, auch wenn nur ein kleiner Teil aktualisiert werden muss.
  2. Reichlich vorhandene Tick-Labels: Eine große Anzahl von Tick-Labels und Unterplots kann den Zeichenprozess erheblich belasten.

Optimierung mit Blitting

Um diese Engpässe zu beheben , erwägen Sie die Verwendung von Blitting. Beim Blitting werden nur bestimmte Teile der Figur aktualisiert, wodurch die Renderzeit verkürzt wird. Für eine effiziente Implementierung ist jedoch Backend-spezifischer Code erforderlich, der möglicherweise die Einbettung von Matplotlib-Plots in ein GUI-Toolkit erfordert.

GUI-Neutral Blitting

Ein GUI-neutrales Blitting Die Technik kann eine angemessene Leistung ohne Backend-Abhängigkeit liefern:

  1. Hintergrund erfassen: Erfassen Sie vor der Animation den Hintergrund jedes Nebenplots, um ihn später wiederherzustellen.
  2. Aktualisieren und Zeichnen: Aktualisieren Sie für jeden Frame die Daten und den Künstler der Linien, stellen Sie den Hintergrund wieder her und löschen Sie den aktualisierten Teil.
  3. Neuzeichnen vermeiden: Verwenden Sie fig.canvas.blit( ax.bbox) anstelle von fig.canvas.draw(), um nur den erforderlichen Bereich zu aktualisieren.

Beispielimplementierung:

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)

Animationsmodul

Neueste Matplotlib-Versionen enthalten ein Animationsmodul, das das Blitting vereinfacht:

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)
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729342040 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3