为什么 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,但似乎还没有朝那个方向做任何事情。
在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,但似乎还没有朝那个方向做任何事情。