Слишком длинное время цикла - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблема со временем выполнения моего кода.Единственный действительно медленный модуль - это цикл for для каждого элемента матрицы в массиве (144, 208).

Я должен проверить каждый элемент, если условие выполнено, и если это так, я должен выполнить несколько действий, таких как смещение другого (144, 208) массива, и добавить его к существующему.

Это не изменится или моя реализация слишком новичка?

Вот мой код:

# With this codeblock i am loading a specific image into python and 
binarize it
g = Initialization()
b_init = g.initialize_grid(".\\geometries\\1.png")

# this function will modify the matrix m_sp, which i load in as csv.file
def expand_blockavg(x, h, w):
    m, n = x.shape
    return np.broadcast_to((x/float(h*w))[:, None, :, None], (m, h, n, w)).reshape(m*h, -1)
    m_adapt = expand_blockavg(m_sp, 16, 16) / 256

# This is my actual calculation block
for index, x in np.ndenumerate(b_init):
    if x == 1:
        a = np.asarray(index)
        y = np.subtract(a, index_default)
        m_shift = shift(m_adapt, (y[0], y[1]), cval=0)
        b = np.add(m_shift, b)

ТАК, последний блок (расчет) - это то, что занимает так много времени.Я знаю, что цикл должен проверять 30 тыс. Элементов.Но я думал, что с NumPy это будет быстрее.

Может ли кто-нибудь1 сказать мне, есть ли потенциал для оптимизации, или я должен смириться с тем, что это займет так много времени.

спасибо

1 Ответ

0 голосов
/ 04 декабря 2018

Итерация в python очень медленная по сравнению с векторизованными операциями с числами.

Немедленная оптимизация состоит в том, чтобы выполнять итерацию только по индексам, для которых матрица равна 1, а не проверять каждый индекс.Сделайте это с:

indices = np.argwhere(b_init == 1)
for a in indices:
    y = np.array(a) - index_default
    m_shift = shift(m_adapt, y[:2], cval=0)
    b += m_shift

Не зная деталей сдвига, трудно сказать, можете ли вы также векторизовать это.Я заменил вызовы функций эквивалентными операциями, которые должны быть быстрее;np.add и т. д. в основном полезны, когда операция выбирается программно.

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