numpy.max はヘビーループでは遅い(Python)

以下の「桁外れに速い」は大きな配列を対象とする場合でした。

numpy.max は桁外れに速い(Python)

今回、小さな配列でのヘビーループ(回数の多いループ)では、
逆に、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 。