In [1]:
import numpy as np
import numba
In [2]:
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)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
100 loops, best of 3: 135 µs per loop
100 loops, best of 3: 8.12 µs per loop
============================================================
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
100 loops, best of 3: 10.1 µs per loop
100 loops, best of 3: 143 µs per loop
============================================================

ほーん(´・ω・`)

シストレしてると、よくohlcのデータを使うので、
100万行4列とかのデータで移動平均なんかを計算するときだとどうだろう(´・ω・`)?
と考えました

In [3]:
# 移動平均はこれで計算しようと思います
@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) # コンパイル
In [4]:
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)
data.flags
   C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

f_data.flags
   C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
In [5]:
%timeit-n100 _ = SMA(data[:, 0])
%timeit-n100 _ = SMA(f_data[:, 0])
100 loops, best of 3: 5.47 ms per loop
100 loops, best of 3: 4.07 ms per loop

ほーん(´・ω・`) 4列くらいじゃそこまで気にするほどでもないか、といった感じですかね

ちなみに、上のSMA関数は、割り算してないからtalibよりちょっと速い(´・ω・`)

In [6]:
import talib as ta
x = np.random.randn(10000)
%timeit-n100 _ = ta.SMA(x, 100)
%timeit-n100 _ = SMA(x, 100)
100 loops, best of 3: 38.9 µs per loop
100 loops, best of 3: 12 µs per loop