Python3で2点間の距離を求める
公式の通り書く、でよさそう。
2点を (x1, y1), (x2, y2) とする。
import math math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
distance.euclidean
でもできるが遅かった。
from scipy.spatial import distance distance.euclidean((x1, y1), (x2, y2))
numpyの linalg.norm
を使うのはもっと遅かった…。
import numpy as np np.linalg.norm(np.array([x1, y1]) - np.array([x2, y2]))
***
実験してみる。
culc_distance.py
import math import numpy as np import time from scipy.spatial import distance # 公式の通り def distance_fomula(a, b): return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) def distance_scipy(a, b): return distance.euclidean((a[0], a[1]), (b[0], b[1])) def distance_numpy(a, b): return np.linalg.norm(np.array([a[0], a[1]]) - np.array([b[0], b[1]])) if __name__ == '__main__': # 適当な点を4つ a = (330, 68) b = (19, -5221) c = (-778, 768) d = (-230, -23) start = time.time() distance_fomula(a, b) distance_fomula(b, c) distance_fomula(c, d) distance_fomula(d, a) elapsed_time = time.time() - start print("[distance_fomula] elapsed_time:{:f}".format(elapsed_time) + "[sec]") start = time.time() distance_scipy(a, b) distance_scipy(b, c) distance_scipy(c, d) distance_scipy(d, a) elapsed_time = time.time() - start print("[distance_scipy] elapsed_time:{:f}".format(elapsed_time) + "[sec]") start = time.time() distance_numpy(a, b) distance_numpy(b, c) distance_numpy(c, d) distance_numpy(d, a) elapsed_time = time.time() - start print("[distance_numpy] elapsed_time:{:f}".format(elapsed_time) + "[sec]")
3回実行してみた結果:
$ python3 culc_distance.py [distance_fomula] elapsed_time:0.000006[sec] [distance_scipy] elapsed_time:0.000569[sec] [distance_numpy] elapsed_time:0.000040[sec] $ python3 culc_distance.py [distance_fomula] elapsed_time:0.000010[sec] [distance_scipy] elapsed_time:0.000201[sec] [distance_numpy] elapsed_time:0.000064[sec] $ python3 culc_distance.py [distance_fomula] elapsed_time:0.000009[sec] [distance_scipy] elapsed_time:0.000195[sec] [distance_numpy] elapsed_time:0.000059[sec]
測り方どのくらい適切なのかわからないけれど、結構はっきり差が出た…。