【发布时间】:2019-11-10 07:17:14
【问题描述】:
我尝试编写高效的代码来处理庞大的列表。我正在比较几个与位置链接的列表。
理论列表:
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 削减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)
显然,这按预期工作,但需要很长时间检查每 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)
首先,我只是检查了这个条件,但是用 68 000 000 个值检查每 215 000 个值显然太长了,这就是为什么我在进行比较之前尝试将 Real 列表减少到最小值。
我希望这是可以理解的,你知道另一种更快的方法吗?感谢您的帮助
【问题讨论】:
-
列表中的值是什么类型的?
-
一种解决方案可能是使用
numpy数组而不是列表。将您的列表作为列加载到pandas.DataFrame并进行处理也可能会有所帮助。这两个库都提供了许多可能支持您的应用程序的功能 -
sqrt函数是瓶颈的一部分。如果 Δx 或 Δy 大于 d,则无需计算实际距离。所以可能的优化是这样的:if Tx[i]-Rx[n]<=d and Ty[i]-Ry[n]<=d and sqrt((Tx[i]-Rx[n])**2+(Ty[i]-Ry[n])**2)<=d:短路评估将防止sqrt函数不必要地运行。 -
@RickHitchcock 甚至不需要调用 sqrt,只需比较距离的平方。而当需要实际距离时,python 提供了 math.hypot。
-
code review 堆栈交换将更适合这个问题恕我直言。
标签: python algorithm list loops optimization