pyplot: очень медленно создавать тепловые карты - PullRequest
5 голосов
/ 04 июня 2010

У меня есть цикл, который выполняет тело около 200 раз. В каждой итерации цикла выполняется сложный расчет, а затем в качестве отладки я хочу создать тепловую карту матрицы NxM. Но создание этой тепловой карты невыносимо медленно и значительно замедляет и без того медленный алгоритм.

Мой код выглядит следующим образом:

import numpy
import matplotlib.pyplot as plt
for i in range(200):
    matrix = complex_calculation()
    plt.set_cmap("gray")
    plt.imshow(matrix)
    plt.savefig("frame{0}.png".format(i))

Матрица, от NumPy, не огромная --- 300 х 600 пар. Даже если я не сохраню рисунок и не обновлю экранный сюжет, он будет еще медленнее.

Конечно, я, должно быть, злоупотребляю кипой. (Matlab может это сделать, без проблем.) Как мне ускорить это?

Ответы [ 2 ]

5 голосов
/ 04 июня 2010

Попробуйте вставить plt.clf() в цикл, чтобы очистить текущую цифру:

for i in range(200):
    matrix = complex_calculation()
    plt.set_cmap("gray")
    plt.imshow(matrix)
    plt.savefig("frame{0}.png".format(i))
    plt.clf()

Если вы этого не сделаете, цикл замедляется, поскольку машина пытается выделить все больше и больше памяти для фигуры.

3 голосов
/ 05 июня 2010

Я думаю, что это немного быстрее:

import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
for i in range(200):
    matrix = complex_calculation()
    ax.imshow(matrix, cmap=cm.gray)
    fig.savefig("frame{0}.png".format(i))

plt.imshow вызывает gca, который вызывает gcf, который проверяет, есть ли фигура; если нет, он создает один. Если сначала создать экземпляр вручную, вам не нужно делать все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...