Анимация Matplotlib слишком медленная (~ 3 кадра в секунду)

Мне нужно оживить данные, поскольку они поставляются с 2D-гистограммой2d (возможно, позже 3D, но, как я слышал, майави лучше для этого).

Вот код:

import numpy as np import numpy.random import matplotlib.pyplot as plt import time, matplotlib plt.ion() # Generate some test data x = np.random.randn(50) y = np.random.randn(50) heatmap, xedges, yedges = np.histogram2d(x, y, bins=5) extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] # start counting for FPS tstart = time.time() for i in range(10): x = np.random.randn(50) y = np.random.randn(50) heatmap, xedges, yedges = np.histogram2d(x, y, bins=5) plt.clf() plt.imshow(heatmap, extent=extent) plt.draw() # calculate and print FPS print 'FPS:' , 20/(time.time()-tstart) 

Он возвращает 3 fps, слишком медленно. Используется ли numpy.random в каждой итерации? Должен ли я использовать blit? Если да, то как?

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

Благодаря @Chris я снова взглянул на примеры, а также нашел здесь этот невероятно полезный пост.

Поскольку @bmu утверждает, что он отвечает (см. Сообщение), используя анимацию. FuncAnimation был для меня способом.

 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation def generate_data(): # do calculations and stuff here return # an array reshaped(cols,rows) you want the color map to be def update(data): mat.set_data(data) return mat def data_gen(): while True: yield generate_data() fig, ax = plt.subplots() mat = ax.matshow(generate_data()) plt.colorbar(mat) ani = animation.FuncAnimation(fig, update, data_gen, interval=500, save_count=50) plt.show() 

Я подозреваю, что использование np.histogram2d в каждой итерации цикла. или что в каждой итерации цикла цикла for вы очищаете и рисуете новую фигуру. Чтобы ускорить работу, вы должны создать рисунок один раз и просто обновить свойства и данные фигуры в цикле. Посмотрите примеры анимации matplotlib для некоторых указателей о том, как это сделать. Обычно он включает вызов matplotlib.pyploy.plot затем в цикле, вызывающий axes.set_xdata и axes.set_ydata .

В вашем случае, однако, взгляните на пример анимационной анимации matplotlib. В этом примере генерация данных отделена от анимации данных (может быть, это отличный подход, если у вас много данных). Разделив эти две части вверх, вы увидите, что вызывает узкое место, numpy.histrogram2d или imshow (используйте time.time() вокруг каждой части).

Ps np.random.randn – генератор псевдослучайных чисел. Они, как правило, являются простыми линейными генераторами, которые могут генерировать много миллионов (psuedo-) случайных чисел в секунду, так что это почти наверняка не ваше узкое место – рисование на экране почти всегда происходит медленнее, чем любое количество хрустов.