2012-04-22 35 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() 

您會發現,第二個方法是相當快。

相關問題