Могу ли я использовать Numba, чтобы этот код python работал быстро? - PullRequest
0 голосов
/ 08 января 2020

У меня есть список длинных и длинных строк приблизительно 5 миллионов данных. Я попробовал код ниже, чтобы создать буфер 25 футов вокруг каждой точки и назначить новый идентификатор местоположения для всех точек, которые попадают в этот буфер. Единственная проблема здесь - производительность кода. Пожалуйста, помогите, я новичок в python и имею дело с огромным набором данных. Любая помощь в этом очень ценится!

import geopy.distance
Coord_List = Sample_Data.Lat_Long.values.tolist()
Coord_List_E = [""]*len(Coord_List)
k =1

for i in range(len(Coord_List)):
    #if  i==0:
        #New_List[i]=k
    if Coord_List_E[i]=="":
        #New_List[i]=k
        for j in range(i,len(Coord_List)):
            if Coord_List_E[j]=="" and abs(geopy.distance.distance(Coord_List[i],Coord_List[j]).ft)<=25 :
                Coord_List_E[j]=k
                Coord_List_E[i]=k
                #print(i,j,k)
        k+=1
    else:
        pass
        
    
print(Coord_List_E)

1 Ответ

2 голосов
/ 09 января 2020

вы можете numba -njit a Python реализация расстояния Хаверсин:

from math import sin, cos, sqrt, atan2, radians
from numba import njit

@njit
def calc_latlon_dist(lat, lon):
    """
    calculate Haversine distance along lat/lon coordinates
    """
    R = 6373.0 # approximate radius of earth in km
    dist = 0.

    for j in range(lat.shape[0]-1):
        lat0, lat1 = radians(lat[j]), radians(lat[j+1])
        lon0, lon1 = radians(lon[j]), radians(lon[j+1])

        dlon = lon1 - lon0
        dlat = lat1 - lat0

        a = sin(dlat / 2)**2 + cos(lat0) * cos(lat1) * sin(dlon / 2)**2
        c = 2 * atan2(sqrt(a), sqrt(1 - a))

        dist += R * c

    return dist

[Source]

...