让Matplotlib运行更快

6 投票
3 回答
2301 浏览
提问于 2025-04-16 07:04

代码片段:

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中绘制了一个球体。我发现提高rstridecstride的值可以让图形的表现更好,但这样会让球体看起来有点奇怪,像是有条纹的样子。我在想,代码中还有哪些其他的地方可以调整,以帮助提升性能。

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 函数进行一些优化。

撰写回答