不确定如何进一步优化(摆脱 for 循环)

Unsure how to further optimise (get rid of for loop)

我正在处理几个数据集。一个数据集(地理数据 - 74 个观测值)包含印度地区名称、地区中心的纬度和经度,而另一个数据集(称为 rainfall_2009)包含有关地理网格中的降雨量以及网格的纬度和经度的信息。目标是 link 每个网格到一个地区,使得网格与地区中心的距离不超过 100 公里。数据集很大——350 000 个观测值。我最初尝试了 运行ning 2 个循环,但我知道这是一种非常不符合 Python 风格的方式,最后它非常低效,大约需要 2.5 小时。我已经设法摆脱了其中一个循环,但 运行 代码仍然需要 1.5 小时。有什么进一步的方法可以优化它吗?

# Create empty variables for district names and distance to the centre

rainfall_2009['district'] = np.nan
rainfall_2009['distance'] = np.nan

# Make a tuple of district centre geographic location (to be used in distance geodesic command)

geodata['location'] = pd.Series([tuple(i) for i in np.array((np.array(geodata.centroid_latitude) , np.array(geodata.centroid_longitude))).T])

# Run the loop for each grid in the dataset. 

for i in tqdm(rainfall_2009.index):
    place = (rainfall_2009.latitude.iloc[i], rainfall_2009.longitude.iloc[i]) # select grid's geographic data
    distance = geodata.location.apply(lambda x: dist.geodesic(place, x).km) # construct series of distances between grid and all regional centers
    if list(distance[distance<100]) == []: # If there are no sufficiently close district centers we just continue the loop
        continue
    else:
        # We take the minimum distance to assign the closest region. 
        rainfall_2009.district.iloc[i] = geodata.distname_iaa.iloc[distance[distance < 100].idxmin()]
        rainfall_2009.distance.iloc[i] = distance[distance < 100].min()

您可以将 pandas 列直接传递给 dist.geodesic() 吗?通过 apply() 语句调用它可能会很慢。

此示例可能会有帮助(请参阅此博客 post 中的函数 gcd_vec()https://tomaugspurger.github.io/modern-4-performance

此外,您可以执行 更少 距离计算吗?例如,如果两个端点处于相同状态或相邻状态,则计算从地理网格到区域中心的距离?

更新: Numba 包可能会进一步加快速度。您只需导入并应用一个装饰器。详情在这里: http://numba.pydata.org/numba-doc/latest/user/jit.html

from numba import jit

@jit
def gcd_vec():
    # same as before