Я пытаюсь использовать максимально возможное время, которое возможно для трехмерного массива в 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: скорость нужна из-за многократного зацикливания.