为什么 numpy 平方根倒数 "x**(-1/2)" 比“1/np.sqrt(x)”慢得多

Why is numpy inverse square root "x**(-1/2)" so much slower than "1/np.sqrt(x)"

在numpy中,平方根和1/2的幂在速度上几乎没有区别。然而,当对-1/2 的幂进行平方根反比时,后者大约慢 10 倍。

# Python 3.10.2; numpy 1.22.1; clang-1205.0.22.11; macOS 12.1
import numpy as np

arr = np.random.uniform(0, 1, 10000)


%timeit -n 10000 np.sqrt(arr)
%timeit -n 10000 arr**(1/2)

%timeit -n 10000 1 / np.sqrt(arr)
%timeit -n 10000 arr**(-1/2)
10.8 µs ± 472  ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
9.97 µs ± 449  ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

18.2 µs ± 673  ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
187  µs ± 13.1 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

更熟悉源代码实现的人能解释一下区别吗?

numpy{-1, 0, 0.5, 1, 2} 中的指数进行特例处理,但没有其他情况。有 an issue opened in 2017 添加到这个集合中添加 -2 和 -0.5,但似乎还没有朝那个方向做任何事情。