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

liwlm1x9  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(86)

在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)

print("Square Root")
%timeit -n 10000 np.sqrt(arr)
%timeit -n 10000 arr**(1/2)

print("Inverse Square Root")
%timeit -n 10000 1 / np.sqrt(arr)
%timeit -n 10000 np.sqrt(1/arr)
%timeit -n 10000 arr**(-1/2)
Square Root
10.3 µs ± 315 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
10.9 µs ± 321 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Inverse Square Root
19.1 µs ± 744 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
19.4 µs ± 791 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
196 µs ± 5.69 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

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

6uxekuva

6uxekuva1#

numpy{-1, 0, 0.5, 1, 2}中指数的特殊情况,而不是其他情况。有an issue opened in 2017添加到这个集合中添加-2和-0.5,但似乎还没有在这个方向上做任何事情。

相关问题