求两个数的平方和的平方根的最有效方法是什么?

G M*_*G M 4 python performance numpy

我正在寻找执行两个或多个数字的平方和的平方根的更有效和最短的方法。我实际上正在使用numpy这个代码:

np.sqrt(i**2+j**2)
Run Code Online (Sandbox Code Playgroud)

这似乎比:

np.sqrt(sum(np.square([i,j])))
Run Code Online (Sandbox Code Playgroud)

(i 和 j 是数字!)

我想知道是否已经有一个更有效的内置函数可以用更少的代码来执行这个非常常见的任务。

Sco*_*y1- 5

对于i != j无法使用 执行此操作的情况np.linalg.norm,因此我建议如下:

(i*i + j*j)**0.5
Run Code Online (Sandbox Code Playgroud)

如果ij是单个浮点数,则这比 快 5 倍np.sqrt(i**2+j**2)。如果ij是 numpy 数组,这大约快 20%(由于用i*i和替换正方形j*j。如果不替换正方形,性能等于np.sqrt(i**2+j**2)
使用单个浮点数的一些计时:

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)
Run Code Online (Sandbox Code Playgroud)

math.sqrt比 稍快(i*i + j*j)**0.5但这是以失去灵活性为代价的:(i*i + j*j)**0.5将适用于单个浮点数和数组,而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)
Run Code Online (Sandbox Code Playgroud)