from numpy import sin, cos, pi, sqrt, arcsin, random
def get_distance(lat, lon, pcode_lat, pcode_lon):
"""
Find the distance between `(lat,lon)` and the reference point
`(pcode_lat,pcode_lon)`.
"""
RAD_FACTOR = pi / 180.0 # degrees to radians for trig functions
lat_in_rad = lat * RAD_FACTOR
lon_in_rad = lon * RAD_FACTOR
pcode_lat_in_rad = pcode_lat * RAD_FACTOR
pcode_lon_in_rad = pcode_lon * RAD_FACTOR
delta_lon = lon_in_rad - pcode_lon_in_rad
delta_lat = lat_in_rad - pcode_lat_in_rad
# Next two lines is the Haversine formula
inverse_angle = (sin(delta_lat / 2) ** 2 + cos(pcode_lat_in_rad) *
cos(lat_in_rad) * sin(delta_lon / 2) ** 2)
haversine_angle = 2 * asin(sqrt(inverse_angle))
EARTH_RADIUS = 6367 # kilometers
return haversine_angle * EARTH_RADIUS
reference = (52.3905927,4.8412508)
points = random.randn(400000, 2) * 0.01
points[:, 0] = points[:, 0] + reference[0]
points[:, 1] = points[:, 1] + reference[1]
def iterate_distance():
d = []
for p in points:
d.append(get_distance(p[0], p[1], reference[0], reference[1]))
%timeit iterate_distance()
1 loops, best of 3: 3.62 s per loop
%timeit [get_distance(p[0], p[1], reference[0], reference[1]) for p in points]
1 loops, best of 3: 3.58 s per loop
%timeit get_distance(points[:, 0], points[:, 1], reference[0], reference[1])
10 loops, best of 3: 22.7 ms per loop