2012-04-22 19 views
10

Me gustaría mostrar una animación simple llamando al imshow en un bucle for. He aquí una demostración de mi problema:¿Por qué mi animación pylab se ralentiza con cada actualización?

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

Tenga en cuenta que genero las imágenes antes de ejecutar el bucle, y que las únicas partes que de tiempo son los imshow y draw funciones. Obtengo resultados que se ven así: Result of running my demo

¿Cómo puedo evitar esta ralentización?

Respuesta

11

Las cosas se ralentizan porque está agregando más y más imágenes y dibujándolas todas cada vez.

O bien 1) borre la trama entre cada imagen (en su caso, pylab.cla()), o mejor aún 2) no cree una imagen nueva, simplemente establezca los datos de la imagen existente en los datos nuevos.

Como un ejemplo del uso 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() 

Y como ejemplo de sólo la creación de los datos:

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

Se dará cuenta de que el segundo método es mucho más rápido.

Cuestiones relacionadas