通过庞大的列表优化循环

时间:2019-06-28 10:14:43

标签: python algorithm list loops optimization

我尝试编写一种有效的代码来处理庞大的列表。我正在比较与位置链接的几个列表。

理论列表:

  

Tx,Ty,Px,Py,Pz(Tx,Ty是位置,Px,Py,Pz是   与这些位置相关联的参数)

真实列表:

Rx,Ry,px,py,pz 
  

len(Tx)= 21.5万和len(Rx)= 6800万

我要做的第一件事是用理论上的maxTxmaxTyminTxminTy切掉Real列表:

 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)

显然,这可以按预期工作,但是用650万个Rx值检查每215 000个Tx值需要花费很长时间。我想要的是与我的状况相关的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个值和68000万个值显然太长了,这就是为什么在进行比较之前,我试图将实数列表减少到最小。

我希望这是可以理解的,您知道另一种更快的方法吗?谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

想象一个尺寸为 d / 2 的网格。

根据 T 所处的网格正方形将其划分为存储桶。您可以使用从网格正方形到点的地图。

现在,对于每个 R 点,您只需将其与距离 d 的9个方格中的 T 点进行比较即可