段:
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 值允许图表具有更好的性能。然而,它们使球体具有奇怪的罗纹形状。我想知道在上面的代码中可以调整哪些其他东西来帮助提高性能。
答案 0 :(得分: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函数的一些优化。
答案 1 :(得分:1)
此时是具有瓶颈的可视化包。点的数量是定义和不变的。
尝试使用psyco可以加快速度(虽然只有32位)。
答案 2 :(得分:0)
我不确定它是否会有所帮助,但也许你可以为matplotlib尝试不同的渲染后端。但也许其中一个会给你更好的表现。
http://matplotlib.sourceforge.net/faq/installing_faq.html#what-is-a-backend