NISHIO Hirokazu[Translate]
ループを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オブジェクトにするコストが丸ごと不要になる
python
In [3]: xs = np.arange(1000_000) In [4]: %timeit sum(xs) 80.5 ms ± 210 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) In [5]: %timeit xs.sum() 448 µs ± 4.18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

添え字アクセスでのインクリメントと、ブロードキャストでのインクリメント、後者が205倍速い
(後者はベンチマークの都合でローカル変数になってるので少しフェアじゃない)
python
In [7]: %%timeit ...: for i in range(1000_000): ...: xs[i] += 1 ...: 284 ms ± 1.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [11]: %%timeit ...: xs = np.arange(1000_000) ...: xs += 1 ...: 1.38 ms ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]