我正在寻找更有效和最短的方法来计算两个或更多数字的平方和的平方根。我实际上正在使用 numpy 和这段代码:
np.sqrt(i**2+j**2)
这似乎比以下内容快五倍:
np.sqrt(sum(np.square([i,j])))
(i 和 j 是数字!)
我想知道是否已经有一个内置函数可以用更少的代码更有效地执行这个非常常见的任务。
请您参考如下方法:
对于 i != j 的情况,使用 np.linalg.norm 是不可能做到这一点的,因此我建议如下:
(i*i + j*j)**0.5
如果 i 和 j 是单 float ,这比 np.sqrt(i**2+j**2)< 快 5 倍左右。如果 i 和 j 是 numpy 数组,这大约快 20%(由于用 i*i 和 j 替换正方形*j。如果不替换正方形,性能等于np.sqrt(i**2+j**2)。
一些使用单个 float 的计时:
i = 23.7
j = 7.5e7
%timeit np.sqrt(i**2 + j**2)
# 1.63 µs ± 15.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit (i*i + j*j)**0.5
# 336 ns ± 7.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit math.sqrt(i*i + j*j)
# 321 ns ± 8.21 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
math.sqrt 比 (i*i + j*j)**0.5 稍快,但是这是有代价的失去灵 active :(i*i + j*j)**0.5 将适用于单个 float 和数组,而 math.sqrt 仅适用于标量。
以及中型数组的一些计时:
i = np.random.rand(100000)
j = np.random.rand(100000)
%timeit np.sqrt(i**2 + j**2)
# 1.45 ms ± 314 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit (i*i + j*j)**0.5
# 1.21 ms ± 78.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
