我尝试编写一种有效的代码来处理庞大的列表。我正在比较与位置链接的几个列表。
理论列表:
Tx,Ty,Px,Py,Pz(Tx,Ty是位置,Px,Py,Pz是 与这些位置相关联的参数)
真实列表:
Rx,Ry,px,py,pz
len(Tx)= 21.5万和len(Rx)= 6800万
我要做的第一件事是用理论上的maxTx
,maxTy
,minTx
和minTy
切掉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万个值显然太长了,这就是为什么在进行比较之前,我试图将实数列表减少到最小。
我希望这是可以理解的,您知道另一种更快的方法吗?谢谢您的帮助
答案 0 :(得分:0)
想象一个尺寸为 d / 2 的网格。
根据 T 所处的网格正方形将其划分为存储桶。您可以使用从网格正方形到点的地图。
现在,对于每个 R 点,您只需将其与距离 d 的9个方格中的 T 点进行比较即可