Как ускорить этот вложенный цикл в Python? - PullRequest
2 голосов
/ 27 сентября 2019

функция, показанная ниже, работает довольно медленно, хотя я использовал swifter для ее вызова.Кто-нибудь знает, как это ускорить?На данный момент мои знания Python ограничены, и я был бы признателен за любую помощь, которую я мог бы получить.Я пытался использовать функцию map (), но у меня почему-то не получилось.Я думаю, что вложенный цикл делает его довольно медленным, верно?

BR, Hannes

def polyData(uniqueIds):
    for index in range(len(uniqueIds) - 1):
        element = uniqueIds[index]
        polyData1 = df[df['id'] == element]
        poly1 = build_poly(polyData1)
        poly1 = poly1.buffer(0)
        for secondIndex in range(index + 1, len(uniqueIds)):
            otherElement = uniqueIds[secondIndex]
            polyData2 = df[df['id'] == otherElement]
            poly2 = build_poly(polyData2)
            poly2 = poly2.buffer(0)
# Calculate overlap percentage wise
            overlap_pct = poly1.intersection(poly2).area/poly1.area
# Form new DF
            df_ol = pd.DataFrame({'id_1':[element],'id_2':[otherElement],'overlap_pct':[overlap_pct]})
# Write to SQL database
            df_ol.to_sql(name='df_overlap', con=e,if_exists='append',index=False)

1 Ответ

1 голос
/ 27 сентября 2019

Эта функция по своей природе медленная для больших объемов данных из-за своей сложности (пробуя каждую 2-комбинацию набора).Однако вы вычисляете 'poly' для одних и тех же идентификаторов несколько раз, даже если кажется, что вы можете рассчитать их только один раз заранее (что может быть дорого) и сохранить их для дальнейшего использования.Поэтому попытайтесь извлечь здание из полисов.

def getPolyForUniqueId(uid):
    polyData = df[df['id'] == uid]
    poly = build_poly(polyData)
    poly = poly.buffer(0)
    return polyData

def polyData(uniqueIds):
    polyDataList = [getPolyForUniqueId(uid) for uid in uniqueIds]
    for index in range(len(uniqueIds) - 1):
        id_1 = uniqueIds[index]
        poly_1 = polyDataList[index]
        for secondIndex in range(index + 1, len(uniqueIds)):
            id_2 = uniqueIds[secondIndex]
            poly_2 = polyDataList[secondIndex]
            ...
...