Maison >développement back-end >Tutoriel Python >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 ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-19 20:47:30198parcourir

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.

Causes de la lenteur

Les performances lentes de Matplotlib proviennent principalement de deux facteurs :

  • Redessins 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 avec 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éduisez le nombre de sous-parcelles et cochez 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 :

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

Bibliothèques alternatives

Si les performances de Matplotlib restent insatisfaisantes, envisagez des bibliothèques de traçage alternatives telles que Bokeh, Plotly ou Altaïr. Ces bibliothèques privilégient l'interactivité en temps réel et l'optimisation des performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn