img = np.arange(1000, dtype=np.uint16)
%timeit a = (img >> 3)
2.06 µs ± 9.03 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit a = (img / 8)
3.01 µs ± 27.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit a = (img / 8).astype(np.uint16)
4.55 µs ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
おそらく型の問題。Pythonはint / int
の返す型がfloat
なので、Numpyもそれに倣ってnp.int32 / np.int32
の返す型がnp.float64
になる。
割り算をシフト演算に置き換える、というと遠い昔にコンパイラの仕事になったような話だが、2019年にもなってからゾンビのように復活した。