Самое эффективное накопительное суммирование в нумбе? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь использовать максимально возможное время, которое возможно для трехмерного массива в python. Я попробовал cumum numpy, но обнаружил, что просто используя параллельный метод вручную с numba:

import numpy as np
from numba import njit, prange
from timeit import default_timer as timer

@njit(parallel=True)
def cpu_cumsum(data, output):
    for i in prange(200):
        for j in prange(2000000):
            output[i,j][0] = data[i,j][0]

    for i in prange(1, 200):
        for j in prange(1,2000000):
            for k in range(1, 5):
                output[i,j,k] = data[i,j,k] + output[i,j,k-1]
    return output

data = np.float32(np.arange(2000000000).reshape(200, 2000000, 5))
output = np.empty_like(data)
func_start = timer()
output = cpu_cumsum(data, output)
timing=timer()-func_start
print("Function: manualCumSum duration (seconds):" + str(timing))

My method:
Function: manualCumSum duration (seconds):2.8496341188924994
np.cumsum:
Function: cumSum duration (seconds):6.182090314569933

Пробуя это с помощью guvectorize, я обнаружил, что он использует слишком много памяти для моего графического процессора, поэтому с тех пор я отказался от этой возможности. Есть ли лучший способ сделать это, или я достиг конца пути? PS: скорость нужна из-за многократного зацикливания.

...