Оптимизировать для цикла с огромными списками - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь написать эффективный код для работы с огромными списками.Я сравниваю несколько списков, связанных с местами.

Теоретические списки:

Tx, Ty, Px, Py, Pz (Tx, Ty - местоположения, а Px, Py, Pz - значения связанных параметровс этими местоположениями)

Реальные списки:

Rx,Ry,px,py,pz 

len (Tx) = 215 000 и len (Rx) = 68 000 000

Первое, что я делаю, это нарезаю Реальные списки теоретическими maxTx, maxTy, minTx и minTy:

 r=[index for index, value in enumerate(Rx) if value<=maxTx and value>=minTx]
 for p in range (len(r)):
        rx.append(Rx[r[p]]) (same for Ry,px,py, pz)

Затем я делаюто же самое для координат y, поэтому я делю квадрат вокруг теоретических местоположений, готовых для сравнения, и теперь len (Rx) = 6 500 000

Теперь я хочу, чтобы каждый индекс реальных местоположений отвечал определенному условию:

       for i in range (len(set(Tx))):
       l=[index for index,value in enumerate(set(Rx)) if value<=Tx[i]+d  and value>=Tx[i]-d]
              for j in range (len(l)):
              rrx.append(Rx[l[j]]) (same for Ry,px,py,pz)

По-видимому, это работает, как и ожидалось, но требуется много времени для проверки каждые 215 000 значений Tx с 6 500 000 значений Rx.Мне нужен индекс значений Rx, относящихся к моему состоянию, поэтому я только сохраняю его.

Затем я проверяю его по y местоположениям с более короткими списками ..

Мое последнее условие:

    for n in range (len(Rrrx)):
        if sqrt((Tx[i]-Rx[n])**2+(Ty[i]-Ry[n])**2)<=d:
            Sx.append(Rx[n])
            Sy.append(Ry[n])
            Dif.append(sqrt((Tx[i]-Rx[n])**2+(Ty[i]-Ry[n])**2)

Во-первых, я только что проверил это условие, но было явно слишком долго проверять каждые 215 000 значений с 68 000 000 значений, поэтому я попытался сократить реальные списки до минимума, прежде чем проводить сравнение.

Надеюсь, это понятно, знаете ли вы другой способ сделать это быстрее?Спасибо за вашу помощь

1 Ответ

0 голосов
/ 28 июня 2019

Представьте себе сетку размером д / 2 .

Разделите T точек на сегменты, в зависимости от того, в каком квадрате сетки они находятся. Вы можете использовать карту от квадрата сетки до точки.

Теперь для каждой R точки вам нужно только проверить ее по T точкам в 9 квадратах, которые находятся на расстоянии d от нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...