import numpy as np
import numba
c_arr = np.random.rand(10000, 10000)
print(c_arr.flags)
%timeit-n100 _ = c_arr[:, 0].sum()
%timeit-n100 _ = c_arr[0, :].sum()
print('='*60)
f_arr = np.asfortranarray(c_arr)
print(f_arr.flags)
%timeit-n100 _ = f_arr[:, 0].sum()
%timeit-n100 _ = f_arr[0, :].sum()
print('='*60)
ほーん(´・ω・`)
シストレしてると、よくohlcのデータを使うので、
100万行4列とかのデータで移動平均なんかを計算するときだとどうだろう(´・ω・`)?
と考えました
# 移動平均はこれで計算しようと思います
@numba.njit
def SMA(x, period=10):
sma = np.empty_like(x, dtype=np.float64)
sum_ = 0
w = 1 / period
for i in range(period):
sma[i] = np.nan
sum_ += x[i]
sma[period-1] = sum_ * w
for i in range(period, len(x)):
sum_ += x[i] - x[i-period]
sma[i] = sum_ * w
return sma
_ = SMA(np.array([0.,0.]), 1) # コンパイル
data = np.random.rand(1000000, 4)
print('data.flags\n', data.flags)
f_data = np.asfortranarray(data)
print('\nf_data.flags\n', f_data.flags)
%timeit-n100 _ = SMA(data[:, 0])
%timeit-n100 _ = SMA(f_data[:, 0])
ほーん(´・ω・`) 4列くらいじゃそこまで気にするほどでもないか、といった感じですかね
ちなみに、上のSMA関数は、割り算してないからtalibよりちょっと速い(´・ω・`)
import talib as ta
x = np.random.randn(10000)
%timeit-n100 _ = ta.SMA(x, 100)
%timeit-n100 _ = SMA(x, 100)