Optimizing Calculations With Numpy And Numba Python
I am trying to make python run standard deviation functions faster with numba and numpy. However the problem is the for loop is very slow and I need alternatives so that I could ma
Solution 1:
You can do this in a vectorised fashion.
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def std_():
std = np.array([list_[i:i+number].std() for i in range(0, len(list_)-number)])
return std
std1 = np.std(rolling_window(list_, 5), axis=1)
print(np.allclose(std1[:-1], std_()))
Gives True
. The code for rolling_window
has been taken from this answer.
Comparison with numba -
import numpy as np
from numba import njit,jit,vectorize
number = 5
list_= np.random.rand(10000)
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def std_():
std = np.array([list_[i:i+number].std() for i in range(0, len(list_)-number)])
return std
%timeit np.std(rolling_window(list_, 5), axis=1)
%%timeit
jitted_func = njit()(std_)
jitted_func()
Gives
499 µs ± 3.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
106 ms ± 2.87 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Post a Comment for "Optimizing Calculations With Numpy And Numba Python"