Улучшение времени матричных операций с помощью многопроцессорной обработки - PullRequest
0 голосов
/ 30 октября 2018

Имея двумерный массив, я делаю следующую операцию:

rows_count = matrix.shape[0]
mr = []
for i in range(0, rows_count-1):
    for j in range(i+1, rows_count):
        mr.append(matrix[i,:] ^ matrix[j:])

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

import multiprocessing as mp
import numpy as np

pool = mp.Pool(mp.cpu_count())
mr = pool.map(np.bitwise_xor,[(matrix[i,:],matrix[j,:]) for i in range(0, rows_count-1) for j in range(i+1, rows_count)])
pool.join()
pool.close()

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

1 Ответ

0 голосов
/ 30 октября 2018

Оформить заказ Numba!

ваш новый код будет выглядеть так

from numba import jit

@jit(parallel=True) #yes this decorator and flag is all it takes to run the function in parallel
def my_time_cosuming_thing(mr=[],matrix=np.array(), rows_count=matrix.shape[0])

    for i in range(0, rows_count-1):
      for j in range(i+1, rows_count):
        mr.append(matrix[i,:] ^ matrix[j:])

    return mr

Numba была создана для того, чтобы сделать петли Python супер эффективными, пытаясь заставить их работать параллельно, посмотрите на http://numba.pydata.org/

Он также совместим с numpy, так что это должно значительно ускорить ваш код, это похоже на магию и работает так хорошо, что я больше никогда не пишу вложенные циклы без него

...