使Matplotlib运行得更快

时间:2010-11-15 04:01:59

标签: python tkinter 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 :(得分: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