„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 > Warum leidet die Leistung beim Plotten mit Matplotlib und was kann getan werden?

Warum leidet die Leistung beim Plotten mit Matplotlib und was kann getan werden?

Veröffentlicht am 06.11.2024
Durchsuche:389

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

Leistungsüberlegungen für Matplotlib-Plots

Bei der Evaluierung verschiedener Python-Plot-Bibliotheken können bei der Verwendung von Matplotlib Leistungsprobleme auftreten. In diesem Artikel wird untersucht, warum das Plotten mit Matplotlib langsam sein kann, und es werden Lösungen zur Verbesserung der Geschwindigkeit bereitgestellt.

Ursachen für Langsamkeit

Die träge Leistung von Matplotlib ist hauptsächlich auf zwei Faktoren zurückzuführen:

  • Häufiges Neuzeichnen: Jedes Mal, wenn fig.canvas.draw() aufgerufen wird, wird die gesamte Figur aktualisiert, einschließlich Elementen wie Achsengrenzen und Teilstrichbeschriftungen. Dieser Prozess ist rechenintensiv.
  • Zahlreiche Unterplots: Plots mit mehreren Unterplots mit vielen Häkchenbeschriftungen können das Rendern erheblich verlangsamen.

Verbesserung der Leistung

Um die Leistung zu steigern, ziehen Sie die folgenden Strategien in Betracht:

1. Blitting verwenden:

Beim Blitting wird nur ein bestimmter Teil der Leinwand aktualisiert, anstatt die gesamte Figur neu zu zeichnen. Dadurch wird der Rechenaufwand drastisch reduziert. Matplotlib bietet Backend-spezifische Blitting-Methoden, die je nach verwendetem GUI-Framework variieren.

2. Neuzeichnen einschränken:

Verwenden Sie beim Plotten die Option „animated=True“. In Kombination mit dem Matplotlib-Animationsmodul ermöglicht diese Technik bestimmte Objektaktualisierungen, ohne eine vollständige Neuzeichnung der Leinwand auszulösen.

3. Unterhandlungen anpassen:

Minimieren Sie die Anzahl der Unterhandlungen und Häkchenbezeichnungen. Entfernen Sie unnötige Elemente, um die Renderzeit zu verkürzen.

4. Verbessern Sie die Codeeffizienz:

Refaktorieren Sie Ihren Code, um seine Struktur zu verbessern und die Anzahl der durchgeführten Operationen zu reduzieren. Verwenden Sie nach Möglichkeit vektorisierte Vorgänge.

Beispiel:

Hier ist eine optimierte Version des in der Frage bereitgestellten Codes unter Verwendung von Blitting mit copy_from_bbox und restart_region:

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

Alternative Bibliotheken

Wenn die Leistung von Matplotlib weiterhin unbefriedigend bleibt, ziehen Sie alternative Plotbibliotheken in Betracht, z als Bokeh, Plotly oder Altair. Diese Bibliotheken priorisieren Echtzeit-Interaktivität und Leistungsoptimierung.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729341981 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