Vectorización del cálculo de distancia de Haversine en Python

Estoy tratando de calcular una matriz de distancia para una larga lista de ubicaciones identificadas por Latitud y Longitud usando elHaversine fórmula que toma dos tuplas de pares de coordenadas para producir la distancia:

def haversine(point1, point2, miles=False):
    """ Calculate the great-circle distance bewteen two points on the Earth surface.

    :input: two 2-tuples, containing the latitude and longitude of each point
    in decimal degrees.

    Example: haversine((45.7597, 4.8422), (48.8567, 2.3508))

    :output: Returns the distance bewteen the two points.
    The default unit is kilometers. Miles can be returned
    if the ``miles`` parameter is set to True.

    """

Puedo calcular la distancia entre todos los puntos usando un bucle anidado para de la siguiente manera:

data.head()

   id                      coordinates
0   1   (16.3457688674, 6.30354512503)
1   2    (12.494749307, 28.6263955635)
2   3    (27.794615136, 60.0324947881)
3   4   (44.4269923769, 110.114216113)
4   5  (-69.8540884125, 87.9468778773)

usando una función simple:

distance = {}
def haver_loop(df):
    for i, point1 in df.iterrows():
        distance[i] = []
        for j, point2 in df.iterrows():
            distance[i].append(haversine(point1.coordinates, point2.coordinates))

    return pd.DataFrame.from_dict(distance, orient='index')

Pero esto lleva bastante tiempo dada la complejidad del tiempo, corriendo alrededor de 20 segundos por 500 puntos y tengo una lista mucho más larga. Esto me tiene mirando a la vectorización, y me he encontradonumpy.vectorize ((documentos), pero no puedo entender cómo aplicarlo en este contexto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta