Способ сделать это для цикла с np.sums быстрее - PullRequest
1 голос
/ 29 сентября 2019

У меня есть этот код, который перебирает список матриц, получает их np.sum и добавляет / вычитает переменные.Этот код является частью более крупной проблемы симуляции, которой я занимаюсь, и, поскольку этот маленький кусочек кода выполняется примерно в 10 и более раз каждый раз, когда я запускаю всю программу, я стараюсь сделать ее максимально эффективной.Есть ли способ упростить это, заставить его работать быстрее?Я искал несколько советов по проверке, но не нашел ни одного, как сделать это более эффективным

#mi could be of any size
mi = np.random.randint(2,size=(4,4))
#the arrays in list_of_blocks could be of any size so the np.sum of the list would end in a ValueError
list_of_blocks = [np.array([[0],[1]]),np.array([[0,0,0],[0,1,0]])]
nee = np.sum(mi)
n1 =0
mrxnr= 0
for block in list_of_blocks:
    nee -= np.sum(block)
    n1 += np.sum(block)
    mrxnr += block.shape[0]*block.shape[1]

1 Ответ

0 голосов
/ 29 сентября 2019

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

Однако в вашем коде есть несколько вещей, которые можно оптимизировать.Массивы в list_of_blocks всегда 0 или 1?В этом случае count_nonzero намного быстрее, чем sum.

Кроме того, block.shape[0]*block.shape[1] эквивалентно block.size, что также быстрее.

Наконец, nee и n1 связаны между собой, поэтому нет необходимости вычислять sum(block) дважды для каждого цикла цикла.Оптимизированный код:

nee = np.sum(mi)
n1 =0
mrxnr= 0
for block in list_of_blocks:
    n1 += np.count_nonzero(block)
    mrxnr += block.size
nee -=n1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...