Почему моя анимация pylab замедляется при каждом обновлении?

Я бы хотел показать простую анимацию, вызвав imshow в цикле for. Вот демо моей проблемы:

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

Обратите внимание, что я генерирую изображения перед запуском цикла и что единственными частями я являются функции imshow и draw. Я получаю результаты, которые выглядят так: Result of running my demo

Как я могу избежать этого замедления?

Ответ 1

Вещи замедляются, потому что вы добавляете все больше изображений и рисуете их каждый раз.

Либо 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()

Вы заметите, что второй метод значительно быстрее.