Для случая i != j
это невозможно сделать с помощью np.linalg.norm
, поэтому я рекомендую следующее:
(i*i + j*j)**0.5
Если i
и j
- одиночные поплавки, это примерно в 5 раз быстрее, чем np.sqrt(i**2+j**2)
. Если i
и j
являются массивами-пустышками, это примерно на 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)
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)