比較するコード
np.mean
np.average
-
np.sum
してから粒子数で割る(jit
あり)
np.mean
とnp.average
はnumbaにサポートされていない。
したがって jit
で高速化できない。
方法
粒子数は 10,000個で、座標の値はランダム:pos = np.random.rand(10000,3)
。
3つめのnp.sum
の関数は次の通り。
@njit
def calc_CoM(pos):
return np.sum(pos, axis=0) / len(pos)
%%timeit
を使用し、10,000回の繰り返しを100回実行した平均値を結果として次章に著す。
結果
コード | 平均計算時間 | 1位との比 | ランキング |
---|---|---|---|
np.mean |
125 μs | 5.2 | 3位 |
np.average |
122 μs | 5.0 | 2位 |
np.sum / len +jit
|
24.2 μs | 1 | 1位 |
numpyのnp.mean
やnp.average
を使うよりも、numbaが対応している関数だけを使ってjit
で高速化したほうが速いことがわかった。
上のランキング表には記載しなかったが、不思議なことに、
np.average
の計算速度の標準偏差は 1.45 μs
なのに対し、
np.mean
は 15.6 μs
と、10倍程度 長かった。
私の手法が統計的に十分かどうかはわからないが、この結果は
np.average
の方が安定した計算速度を出せるということを示す。
参考
np.mean
とnp.average
の違いは、例えばこのリンクを見るとわかる。