2010-11-15 7 views
5

Snippet:Faire Matplotlib courir plus vite

ax = Axes3D(self.fig) 

u = np.linspace(0, 2 * np.pi, 100) 
v = np.linspace(0, np.pi, 100) 

x = self.prop * np.outer(np.cos(u), np.sin(v)) 
y = self.prop * np.outer(np.sin(u), np.sin(v)) 
z = self.prop * np.outer(np.ones(np.size(u)), np.cos(v)) 

t = ax.plot_surface(x, y, z, rstride=6, cstride=6,color='lightgreen',linewidth=0) 
self.canvas.draw() 

L'extrait ci-dessus représente graphiquement une sphère en utilisant tkinter matplotlib. J'ai trouvé que rstride et cstride valeurs permettent au graphique d'avoir une performance un peu meilleure. Cependant, ils donnent à la sphère une forme nervurée bizarre. Je me demandais quelles autres choses pourraient être ajustées dans le code ci-dessus pour aider à améliorer les performances.

Répondre

13

Vraiment, le problème est plus dans les plot_surface. Il y a beaucoup de choses qui peuvent être faites pour l'améliorer. Par exemple, l'ombrage prend beaucoup de temps et en changeant une ligne:

colors = [color * (0.5 + norm(v) * 0.5) for v in shade] 

à

colors = np.outer(0.5+norm(shade)*0.5,color) 

dans l'une des fonctions utilisées par plot_surface, je suis une réduction d'environ 28% l'exécution globale. Pourquoi? La fonction norm (bien, class type of) est configurée pour la vectorisation, mais n'a pas été utilisée de cette manière. Je sais qu'il y a beaucoup de ces choses dans ces fonctions qui ne sont pas très optimales. Modification des deux lignes:

for rs in np.arange(0, rows-1, rstride): 
    for cs in np.arange(0, cols-1, cstride): 

à

for rs in xrange(0,rows-1,rstride): 
    for cs in xrange(0,cols-1,cstride): 

dans la fonction plot_surface lui-même donne une autre amélioration substantielle - maintenant, nous sommes en baisse de 33% du temps d'exécution d'origine. D'après ce que j'ai vu, le code n'est pas vraiment écrit pour l'efficacité, mais pour le faire fonctionner à partir de ce que je peux dire - il y a beaucoup d'endroits où les choses pourraient être plus vectorisées en utilisant Numpy et ne sont pas. J'ai peur que ce qui est vraiment nécessaire soit une optimisation des fonctions de matplotlib.

+0

Cela ressemble à de très bons correctifs dont le fichier est la fonction plot_surface? – rectangletangle

+0

Il se trouve dans le fichier mpl_toolkits/mplot3d/axes3d.py. Le deuxième changement est en fait dans 'plot_surface'. Le premier changement est dans une fonction appelée '_shade_colors', appelée' plot_surface'. Je travaille sur la soumission de ces changements à la source. –

+0

Wow, c'est des trucs vraiment bien! Merci – rectangletangle

1

À ce stade, le package de visualisation présente le goulot d'étranglement. Le nombre de points est défini et constant. Essayez si l'utilisation de psyco peut l'accélérer (seulement 32 bits).

Questions connexes