pourquoi est-comploter avec Matplotlib-elle si lente?
Je suis actuellement en train d'évaluer les différentes python traçage des bibliothèques. Droit maintenant, je vais essayer matplotlib et je suis très déçu par la performance. L'exemple suivant est modifié à partir de SciPy exemples et donne-moi seulement de ~ 8 images par seconde!
Toutes les manières de l'excès de cela ou dois-je choisir un autre tracé de la bibliothèque?
from pylab import *
import time
ion()
fig = figure()
ax1 = fig.add_subplot(611)
ax2 = fig.add_subplot(612)
ax3 = fig.add_subplot(613)
ax4 = fig.add_subplot(614)
ax5 = fig.add_subplot(615)
ax6 = fig.add_subplot(616)
x = arange(0,2*pi,0.01)
y = sin(x)
line1, = ax1.plot(x, y, 'r-')
line2, = ax2.plot(x, y, 'g-')
line3, = ax3.plot(x, y, 'y-')
line4, = ax4.plot(x, y, 'm-')
line5, = ax5.plot(x, y, 'k-')
line6, = ax6.plot(x, y, 'p-')
# turn off interactive plotting - speeds things up by 1 Frame /second
plt.ioff()
tstart = time.time() # for profiling
for i in arange(1, 200):
line1.set_ydata(sin(x+i/10.0)) # update the data
line2.set_ydata(sin(2*x+i/10.0))
line3.set_ydata(sin(3*x+i/10.0))
line4.set_ydata(sin(4*x+i/10.0))
line5.set_ydata(sin(5*x+i/10.0))
line6.set_ydata(sin(6*x+i/10.0))
draw() # redraw the canvas
print 'FPS:' , 200/(time.time()-tstart)
- Les éléments suivants peuvent être utiles: stackoverflow.com/questions/5003094/...
- Glumpy seulement aidé dans cet exemple parce qu'il a été de traiter rapidement l'affichage de données d'image. Il ne va pas aider dans ce cas.
- Essayez de changer l'arrière-plan. Voir ma réponse: stackoverflow.com/a/30655528/2066079. ou la cette FAQ sur les backends: matplotlib.org/faq/usage_faq.html#what-is-a-backend
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, (bien que cela ne changera pas la performance à tous) d'envisager le nettoyage de votre code, similaire à ceci:
Avec l'exemple ci-dessus, j'obtiens environ 10 images par seconde.
Juste une petite remarque, en fonction de votre cas d'utilisation, matplotlib peut-être pas un grand choix. Il est orienté vers la qualité publication des chiffres, pas d'affichage en temps réel.
Cependant, il y a beaucoup de choses que vous pouvez faire à la vitesse de cet exemple jusqu'.
Il y a deux principales raisons à cela est aussi lent que c'est.
1) en Appelant
fig.canvas.draw()
redessine tout. C'est votre goulot d'étranglement. Dans votre cas, vous n'avez pas besoin de re-dessiner des choses comme les axes de frontières, les étiquettes de graduation, etc.2) Dans votre cas, il y a beaucoup de sous-intrigues avec un lot d'étiquettes de graduation. Ils prennent beaucoup de temps pour dessiner.
Ces deux peut être résolu par l'utilisation de blitting.
Faire blitting de manière efficace, vous aurez à utiliser backend-code spécifique. Dans la pratique, si vous êtes vraiment inquiet à propos des animations fluides, vous êtes habituellement l'incorporation de matplotlib parcelles dans une sorte de boite à outils graphique, de toute façon, donc ce n'est pas vraiment un problème.
Toutefois, sans le savoir un peu plus sur ce que vous êtes en train de faire, je ne peux pas vous aider là-bas.
Néanmoins, il existe un gui-neutre façon de faire qui est encore assez rapide.
Cela me donne ~200fps.
Pour rendre cela un peu plus pratique, il y a un
animations
module dans les versions récentes de matplotlib.Comme un exemple:
gtk
outk
. Je dois courir pour le moment, mais je vais avoir un coup d'oeil plus tard. Je vais sans doute faire quelque chose qui n'arrive qu'à travailler avec la version la plus récente, mais qui ne sont pas avec les versions antérieures. La stratégie générale va certainement travailler sur des versions antérieures (et c'est votre meilleure option si vous n'avez pas le module d'animation).animation
semble pour mettre à jour le complot ourdi parinterval
période de temps, si je veux juste le mettre à jour lorsque de nouvelles données sont-elles prêtes?PyQt
application une fois à l'aide dematplotlib
pour la visualisation des données, et il était doux, rapide et efficace, aussi la qualité de l'image est ok, pour la qualité de la publication, je n'aurais jamais utiliser unpng
image, ou similaires, c'est pourquoi il existetikz
pgfplots
ils sont tellement belles, c'est vraiment de haute qualité. Comme pourmatplotlib
il est devenu tellement lent, que c'est inutilisable, je suis désinstallation dès maintenant et de revenir à lagnuplot
.Matplotlib fait de grands publication graphiques de qualité, mais n'est pas très bien optimisé pour la vitesse.
Il existe une variété de python traçage de paquets qui sont conçus avec la vitesse à l'esprit:
[ edit: pyqwt n'est plus maintenu; le précédent responsable recommande pyqtgraph ]
Pour commencer, Joe kingston portant la réponse de donne de très bons conseils, à l'aide de l'interface approche neutre, et vous devriez certainement prendre ses conseils (notamment sur la Blitting) et la mettre en pratique. Plus d'infos sur cette approche, lire la Matplotlib Livre De Recettes
Cependant, la non-GUI-neutre (GUI-biaisée?) approche est essentielle pour accélérer le tracé. En d'autres termes, la backend est extrêmement important pour l'intrigue de la vitesse.
Mettre ces deux lignes avant d'importer quoi que ce soit d'autre de matplotlib:
Bien sûr, il y a plusieurs options pour utiliser à la place de
GTKAgg
, mais selon le livre mentionné avant, c'était le plus rapide. Voir le lien sur les backends pour plus d'options.Pour la première solution proposée par Joe Kingston Portant ( .copy_from_bbox & .draw_artist & de la toile.blit), je devais saisir les origines après la fig.toile.draw() de la ligne, sinon le fond n'a eu aucun effet et j'ai obtenu le même résultat, comme vous l'avez mentionné. Si vous vous mettez à après la fig.show() il ne fonctionne toujours pas comme proposé par Michael Browne.
Donc suffit de mettre l'arrière-plan de la ligne de après la toile.draw():
Cela peut ne pas s'appliquer à beaucoup d'entre vous, mais je suis en général d'exploitation de mon ordinateurs sous Linux, donc par défaut je enregistrer mon matplotlib parcelles PNG et SVG. Cela fonctionne très bien sous Linux, mais est insupportablement lent sur mon Windows 7 installations [MiKTeX sous Python(x,y) ou Anaconda], j'ai donc pris pour l'ajout de ce code, et les choses fonctionnent bien sur il y a de nouveau: