Vetorizando o cálculo da distância de Haversine em Python

Estou tentando calcular uma matriz de distância para uma longa lista de locais identificados por Latitude e Longitude usando o métodoHaversine fórmula que usa duas tuplas de pares de coordenadas para produzir a distância:

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.

    """

Posso calcular a distância entre todos os pontos usando um loop for aninhado da seguinte maneira:

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 uma função simples:

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')

Mas isso leva bastante tempo, dada a complexidade do tempo, rodando em torno de 20s para 500 pontos e eu tenho uma lista muito mais longa. Isso me faz olhar para a vetorização, e me deparei comnumpy.vectorize ((docs), mas não consegue descobrir como aplicá-lo neste contexto.

questionAnswers(3)

yourAnswerToTheQuestion