ループをNumpyに任せる
Numpyを使う上ではループをNumpy側でやるかPython側でやるかが速度に大きく影響する
sum(xs) v.s. xs.sum(): xs.sum()が178倍早い
sum(xs)ではPython側でnp.arrayを単なる汎用のiterableだとみなして合計している
xs.sum()では、Numpy側が、np.arrayであることを理解して合計している
後者の場合、値をPyFloatオブジェクトにするコストが丸ごと不要になる
code:python
In 3: xs = np.arange(1000_000) 80.5 ms ± 210 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
448 µs ± 4.18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
添え字アクセスでのインクリメントと、ブロードキャストでのインクリメント、後者が205倍速い
(後者はベンチマークの都合でローカル変数になってるので少しフェアじゃない)
code:python
...: for i in range(1000_000):
...:
284 ms ± 1.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
...: xs = np.arange(1000_000)
...: xs += 1
...:
1.38 ms ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)