在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)
熟悉源代码实现的人能解释一下其中的区别吗?
1条答案
按热度按时间6uxekuva1#
numpy
是{-1, 0, 0.5, 1, 2}
中指数的特殊情况,而不是其他情况。有an issue opened in 2017添加到这个集合中添加-2和-0.5,但似乎还没有在这个方向上做任何事情。