比較するコード
np.meannp.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の違いは、例えばこのリンクを見るとわかる。