Хороший однострочник:
dist = numpy.linalg.norm(a-b)
Однако, если скорость имеет значение, я бы порекомендовал поэкспериментировать на вашей машине. Я обнаружил, что использование sqrt
библиотеки *1005* с оператором **
для квадрата намного быстрее на моей машине, чем однострочное решение NumPy.
Я провел свои тесты с помощью этой простой программы:
#!/usr/bin/python
import math
import numpy
from random import uniform
def fastest_calc_dist(p1,p2):
return math.sqrt((p2[0] - p1[0]) ** 2 +
(p2[1] - p1[1]) ** 2 +
(p2[2] - p1[2]) ** 2)
def math_calc_dist(p1,p2):
return math.sqrt(math.pow((p2[0] - p1[0]), 2) +
math.pow((p2[1] - p1[1]), 2) +
math.pow((p2[2] - p1[2]), 2))
def numpy_calc_dist(p1,p2):
return numpy.linalg.norm(numpy.array(p1)-numpy.array(p2))
TOTAL_LOCATIONS = 1000
p1 = dict()
p2 = dict()
for i in range(0, TOTAL_LOCATIONS):
p1[i] = (uniform(0,1000),uniform(0,1000),uniform(0,1000))
p2[i] = (uniform(0,1000),uniform(0,1000),uniform(0,1000))
total_dist = 0
for i in range(0, TOTAL_LOCATIONS):
for j in range(0, TOTAL_LOCATIONS):
dist = fastest_calc_dist(p1[i], p2[j]) #change this line for testing
total_dist += dist
print total_dist
На моей машине math_calc_dist
работает намного быстрее, чем numpy_calc_dist
: 1,5 секунды против 23,5 секунды .
Чтобы измерить разницу между fastest_calc_dist
и math_calc_dist
, мне пришлось увеличить TOTAL_LOCATIONS
до 6000. Затем fastest_calc_dist
занимает ~ 50 секунд , а math_calc_dist
- ~ 60 секунд .
Вы также можете поэкспериментировать с numpy.sqrt
и numpy.square
, хотя оба варианта были медленнее, чем альтернативы math
на моей машине.
Мои тесты запускались с Python 2.6.6.