よせなべ

プログラミングを入れた鍋にガジェットやゲームなど様々な材料を入れて煮込みます。

ndarrayは後ろに置け

numpyでの高速化についてです。

np.arange(n) * a1 * a2 * a3 * a4

より

a1 * a2 * a3 * a4 * np.arange(n)

の方が速いです。

正弦波合成の式にtimeitで処理時間を計測すると、

import math
import numpy as np
n = 10**7
fs = 440
smp = 44100
%timeit -n 10 np.arange(n) * 2 * math.pi * fs / smp
%timeit -n 10 2 * math.pi * fs / smp * np.arange(n)
10 loops, best of 3: 241 ms per loop
10 loops, best of 3: 89.7 ms per loop

上の式だと計算量が「ndarrayの要素数 × 他の変数の数」になり、
下の式だと「(他の変数の数 - 1) + ndrarrayの要素数」になっていそうです。
ndarrayの要素数を n 、他の変数の数を m とすると、
n * m と n + (m - 1) では、だいぶ変わります。

ですので、ndarrayを後ろに置く下の式のタイプか、
他の変数を先に計算しておくのをおすすめします。

入門 Python 3

入門 Python 3