以下の「桁外れに速い」は大きな配列を対象とする場合でした。
今回、小さな配列でのヘビーループ(回数の多いループ)では、
逆に、numpy を使うと、明らかに遅くなってしまいました。
100万回程度の繰り返しにて、これだけ差が出てしまいました。
numpy はオーバーヘッドが大きいのかもしれません。
import time import numpy as np def chk(fn, a): st = time.time() for i in range(1000000): s = fn(a) print(time.time() - st) a = [0, 1] chk(max, a) chk(max, np.array(a)) chk(np.max, a) chk(np.max, np.array(a))
0.17012476921081543
0.8915903568267822
5.12544059753418
2.528871536254883
なお、max のみならず numpy.median 等でも、同様の傾向が見られました。
比較のための median は statistics ライブラリを使用しました。
import time import numpy as np import statistics as st def chk(fn, a): st = time.time() for i in range(1000000): s = fn(a) print(time.time() - st) a = [0, 1] chk(st.median, a) chk(st.median, np.array(a)) chk(np.median, a) chk(np.median, np.array(a))
0.49211883544921875
1.556931972503662
22.91332697868347
21.753185510635376
巨大な配列では、numpy のほうが明らかに高速ですが、
大きなループの中では、オーバーヘッド?が問題になるようで
使い分けが必要なようです。
for ループを避けて行列操作のみで片付けば numpy はそれが一番
速いと思いますが、そうでなかった場合に考慮が要りそうです。
Python のバージョンは 3.7.3 。