"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Lors du traçage avec Matplotlib, pourquoi les performances souffrent-elles et que peut-on faire ?

Lors du traçage avec Matplotlib, pourquoi les performances souffrent-elles et que peut-on faire ?

Publié le 2024-11-06
Parcourir:887

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

Considérations sur les performances pour le traçage Matplotlib

Lors de l'évaluation de différentes bibliothèques de traçage Python, vous pouvez rencontrer des problèmes de performances lors de l'utilisation de Matplotlib. Cet article explore pourquoi le traçage de Matplotlib peut être lent et propose des solutions pour améliorer sa vitesse.

La lenteur provoque

Les performances lentes de Matplotlib proviennent principalement de deux facteurs :

  • Redessinements fréquents : Chaque fois que fig.canvas.draw() est appelé, il actualise la figure entière, y compris des éléments tels que les limites des axes et les étiquettes de graduation. Ce processus nécessite beaucoup de calculs.
  • De nombreuses sous-parcelles : Les tracés comportant plusieurs sous-parcelles comportant de nombreuses étiquettes de graduation peuvent ralentir considérablement le rendu.

Amélioration des performances

Pour améliorer les performances, envisagez les stratégies suivantes :

1. Utiliser le Blitting :

Le Blitting implique uniquement de mettre à jour une partie spécifique du canevas au lieu de redessiner la figure entière. Cela réduit considérablement la charge de calcul. Matplotlib fournit des méthodes de blitting spécifiques au backend qui varient en fonction du framework GUI utilisé.

2. Restreindre le redessin :

Utilisez l'option animation=True lors du traçage. Combinée au module d'animations Matplotlib, cette technique permet des mises à jour d'objets spécifiques sans déclencher un redessinage complet du canevas.

3. Personnaliser les sous-parcelles :

Réduire le nombre de sous-parcelles et cocher les étiquettes. Supprimez les éléments inutiles pour réduire le temps de rendu.

4. Améliorez l'efficacité du code :

Refactorisez votre code pour améliorer sa structure et réduire le nombre d'opérations effectuées. Utilisez des opérations vectorisées lorsque cela est possible.

Exemple :

Voici une version optimisée du code fourni dans la question, en utilisant le blitting avec copy_from_bbox et restaurer_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))

Bibliothèques alternatives

Si les performances de Matplotlib restent insatisfaisantes, envisagez des bibliothèques de traçage alternatives telles que comme Bokeh, Plotly ou Altair. Ces bibliothèques donnent la priorité à l'interactivité en temps réel et à l'optimisation des performances.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729341981. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3