2012-04-22 4 views
10

forループでimshowを呼び出して簡単なアニメーションを表示したいと思います。部分だけ私の時間がimshowdraw機能があることを私のピラブアニメーションは、アップデートごとに遅くなるのはなぜですか?

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() 

注私はループを実行する前に画像を生成し、そして:ここに私の問題のデモです。結果は次のようになります。 Result of running my demo

どうすればこの減速を回避できますか?

答えて

11

イメージが増えていて、そのたびに、すべてと描画されているため、状況が減速しています。

各画像間のプロットを消去してください(あなたの場合は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() 

あなたは第2の方法は、かなり高速であることがわかります。

関連する問題