让Matplotlib运行更快
代码片段:
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()
上面的代码片段使用matplotlib在tkinter中绘制了一个球体。我发现提高rstride和cstride的值可以让图形的表现更好,但这样会让球体看起来有点奇怪,像是有条纹的样子。我在想,代码中还有哪些其他的地方可以调整,以帮助提升性能。
3 个回答
0
我不太确定这样做是否有帮助,但你可以试试用不同的渲染后端来运行matplotlib。也许其中一个会让你的性能更好。
http://matplotlib.sourceforge.net/faq/installing_faq.html#what-is-a-backend
1
现在这个可视化工具是瓶颈所在。数据点的数量是固定的,不会变化。
可以试试用psyco来加速一下(不过它只支持32位系统)。
13
其实,问题主要出在 plot_surface
这个函数上。我们可以做很多事情来让它更快。例如,阴影处理花费了很多时间,只需改一行代码:
colors = [color * (0.5 + norm(v) * 0.5) for v in shade]
改成
colors = np.outer(0.5+norm(shade)*0.5,color)
在 plot_surface
使用的某个函数里,我发现整体运行时间减少了大约28%。为什么呢?因为 norm
这个函数(其实是个类)是为了处理向量而设计的,但之前并没有这样使用。我知道这些函数里还有很多地方没有做到最优。再把这两行代码:
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):
在 plot_surface
函数里,又能大幅提升性能——现在整体运行时间比原来减少了33%。
从我看到的情况来看,这段代码并不是特别注重效率,更多的是为了能正常工作。很多地方其实可以用 Numpy 让代码更高效,但并没有这样做。我觉得真正需要的是对 matplotlib 函数进行一些优化。