I tried to speed up my python code with cupy instead of numpy. The problem here is, that using cupy, my code got drastically slower. Maybe I went a little bit to naive on that problem. Maybe anyone can find a bottleneck in my code: import cupy as np import time as ti def f(y, t): y_ = np.zeros(2 * N_1*N_2) # n: e-6, c: e-5 for i in range(0, N_1*N_2): y_ = y[i + N_1*N_2] # n: e-7, c: e-5 or e-6 for i in range(N_1*N_2): sum = -4*y # n: e-7, c: e-7 after some statements e-5 if (i + 1 in indexes) and (not (i in indi)): sum += y[i+1] # n: e-7, c: e-7 after some statements e-5 if (i - 1) in indexes and (i % N_1 != 0): sum += y[i-1] # n: e-7, c: e-7 after some statements e-5 if i + N_1 in indexes: sum += y[i+N_1] # n: e-7, c: e-7 after some statements e-5 if i - N_1 in indexes: sum += y[i-N_1] # n: e-7, c: e-7 after some statements e-5 y_[i + N_1*N_2] = sum return y_ def k_1(y, t, h): return np.asarray(f(y, t)) * h def k_2(y, t, h): return np.asarray(f(np.add(np.asarray(y) , np.multiply(1/2 , k_1(y, t, h))), t + 1/2 * h)) * h # k_2, k_4 look just like k_2, may be with an 1/2 here or there # some init stuff is happening here while t < T_end: # also some magic happening here which is just data saving y = np.asarray(y) + 1/6*(k_1(y, t, m) + 2*k_2(y, t, m) + 2*k_3(y, t, m) + k_4(y, t, m)) t += m EDIT I tried to benchmark my code and here are some results they can be seen as a comment in the code. Each number stays for one line. The units are seconds. n: Numpy, c:CuPy, i mostly give a rough estimate of the order. Additional i tested np.multiply # n: e-6, c: e-5 and np.add # n: e-5 or e-6, c: 0.005 or e-5 Continue reading...