ofutonneko

情弱がんばる自分用めも

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]

測り方どのくらい適切なのかわからないけれど、結構はっきり差が出た…。