2012-04-22 34 views
10

我想通过在for循环中调用imshow来显示一个简单的动画。这里是我的问题的演示:为什么我的pylab动画在每次更新时变慢?

import pylab,time 
images = [pylab.uniform(0,255,(50,50)) for _ in xrange(40)] 
pylab.ion() 
timings = [] 
for img in images: 
    tic = time.time() 
    pylab.imshow(img) 
    pylab.draw() 
    toc = time.time() 
    timings.append(toc-tic) 
pylab.clf() 
pylab.plot(timings) 
pylab.title('elapsed time per iteration') 
pylab.ioff() 
pylab.show() 

请注意,我在运行循环之前生成的图像,并且只有部分我的时间是imshowdraw功能。我得到的结果如下: Result of running my demo

我该如何避免这种放缓?

回答

11

事情正在放缓,因为你正在添加越来越多的图像,并绘制它们所有每次。

要么1)清除每个图像(在你的情况下,pylab.cla()),或更好的情节2)不要制作一个新的图像,只需将现有图像的数据设置为新的数据。

由于使用cla()的例子:

import matplotlib.pyplot as plt 
import numpy as np 

images = np.random.uniform(0, 255, size=(40, 50, 50)) 

fig, ax = plt.subplots() 

fig.show() 
for image in images: 
    ax.imshow(image) 
    fig.canvas.draw() 
    ax.cla() 

而作为只需设置数据的示例:

import matplotlib.pyplot as plt 
import numpy as np 

images = np.random.uniform(0, 255, size=(40, 50, 50)) 

fig, ax = plt.subplots() 

im = ax.imshow(images[0]) 
fig.show() 
for image in images[1:]: 
    im.set_data(image) 
    fig.canvas.draw() 

您会发现,第二个方法是相当快。

相关问题