¿Por qué mi animación de pylab se ralentiza con cada actualización?

Me gustaría mostrar una animación simple llamando a imshow en un bucle for. Aquí hay una demostración de mi problema:

 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 imshow son las funciones imshow y draw . Estoy obteniendo resultados que se ven así: Resultado de ejecutar mi demo

¿Cómo puedo evitar esta desaceleración?

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

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

Como ejemplo de uso de 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 solo configurar 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() 

Notarás que el segundo método es considerablemente más rápido.