2010-11-15 12 views
5

Fragmento:Matplotlib correr más rápido

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

El fragmento anterior representa gráficamente una esfera en tkinter usando matplotlib. Descubrí que los valores rstride y cstride más altos permiten que el gráfico tenga un mejor rendimiento. Sin embargo, dan a la esfera una extraña forma acanalada. Me preguntaba qué otras cosas podrían ajustarse en el código anterior para ayudar a mejorar el rendimiento.

Respuesta

13

En realidad, el problema es más dentro de plot_surface. Hay muchas cosas que se pueden hacer para mejorarlo. Por ejemplo, el sombreado lleva mucho tiempo y con sólo cambiar una sola línea:

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

a

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

dentro de una de las funciones utilizadas por plot_surface, tengo una reducción de alrededor del 28% en el tiempo de ejecución general. ¿Por qué? La función norm (bueno, tipo de clase) está configurada para la vectorización, pero no se estaba utilizando de esa manera. Sé que hay muchas cosas similares dentro de estas funciones que no son muy óptimas. Cambio de las dos líneas:

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

a

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

en la función plot_surface sí da otra mejora sustancial - ahora estamos un 33% del tiempo de ejecución inicial.

Por lo que he visto, el código no está escrito realmente para la eficiencia tanto como para hacer que funcione por lo que puedo decir - hay muchos lugares donde se podría hacer que las cosas se vectoricen más usando Numpy y no lo son. Me temo que lo que realmente se necesita es una optimización de las funciones matplotlib.

+0

Parecen correcciones realmente buenas ¿En qué archivo está la función plot_surface? – rectangletangle

+0

Está en el archivo mpl_toolkits/mplot3d/axes3d.py. El segundo cambio está realmente dentro de 'plot_surface'. El primer cambio se produce dentro de una función llamada '_shade_colors' que' plot_surface' llama. Estoy trabajando en enviar estos cambios a la fuente. –

+0

Guau, eso es algo realmente bueno! Gracias – rectangletangle

1

En este punto es el paquete de visualización que tiene el cuello de botella. El número de puntos está definido y es constante.

Intente si usando psyco puede acelerarlo (aunque solo tiene 32 bits).