【问题标题】:Optimize for loop with huge lists使用大量列表优化 for 循环
【发布时间】: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

我做的第一件事是用理论上的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)

显然,这按预期工作,但需要很长时间检查每 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]&lt;=d and Ty[i]-Ry[n]&lt;=d and sqrt((Tx[i]-Rx[n])**2+(Ty[i]-Ry[n])**2)&lt;=d: 短路评估将防止sqrt 函数不必要地运行。
  • @RickHitchcock 甚至不需要调用 sqrt,只需比较距离的平方。而当需要实际距离时,python 提供了 math.hypot。
  • code review 堆栈交换将更适合这个问题恕我直言。

标签: python algorithm list loops optimization


【解决方案1】:

想象一个大小为 d/2 的网格。

T个点根据它们所在的方格划分为桶。您可以使用从方格到点的地图。

现在,对于每个 R 点,您只需对照距离 d 内的 9 个方格中的 T 点进行检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多