提高大表值比较代码的计算速度

2024-09-28 01:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我几周前刚开始编程。我正在处理12个大型数据集,需要对表的特定列中的值进行比较。每个表都包含x-coordinates(称为'X\u IMA')和y-coordinates(称为'Y\u IMA')以及其他对比较过程不重要的数据。数据分为4组,共3个表(对于数据集1的表,我称之为表11表12表13

例如,我希望比较表11表12表13,并检查是否存在一个x-coordinate,该x-coordinate表2表3中的x-coordinate相等(在某个+-范围内)。如果是这样,我想检查y坐标是否相等,如果是这样,这就被认为是匹配

根据匹配项将附加数据写入新文件。我想比较所有4个数据集的匹配情况。我使用嵌套for循环和if语句进行比较;但是,代码在20核集群上运行需要~2小时,这对于调试和确保它实际正常工作来说是非常低效的。我能做些什么来清理我的代码并缩短运行时间?或者整理循环以提高效率,或者有其他方法以这种方式比较大型数据集

如有任何意见,我们将不胜感激:)

以下是一组(共4组)表比较的代码:

    for x in range(0, len(table11)):
        for y in range(0, len(table12)):
            for z in range(0, len(table13)):
                if table12[y]["X_IMA"]-5<=table13[z]["X_IMA"]<=table12[y]["X_IMA"]+5 and table12[y]["Y_IMA"]-5<=table13[z]["Y_IMA"]<=table12[y]["Y_IMA"]+5 and table11[x]["X_IMA"]-5<=table13[z]["X_IMA"]<=table11[x]["X_IMA"]+5 and table11[x]["Y_IMA"]-5<=table13[z]["Y_IMA"]<=table11[x]["Y_IMA"]+5:
                    for i in range(0,20):,
                        if table11[x]["X_IMA"]-5<=reglistx[i]<=table11[x]["X_IMA"]+5 and table11[x]["Y_IMA"]-5<=reglisty[i]<=table11[x]["Y_IMA"]+5:
                            rateavg1[i]=(np.mean([table11[x]["RATE"],table12[y]["RATE"],table13[z]["RATE"]]))

reglist是x-y坐标的主列表,我希望将3个表的匹配x-y坐标与之进行比较,然后从表中提取数据并将其写入文件

再说一次,任何输入,哪怕是提高计算速度的小提示,都会有很大的帮助

干杯


Tags: and数据代码incoordinateforlenif
1条回答
网友
1楼 · 发布于 2024-09-28 01:30:51

当前代码的问题是对所有值的组合执行3向比较(这太多了)。因此,最初的改进是:

  • 找出哪些索引只在表11和表11之间匹配;12个
  • 然后仅将匹配的索引与表13进行比较
  • 然后只将匹配的索引与reglist进行比较

这里最重要的是检查表的顺序-较小的表应该排在第一位(例如,如果table 11比其他表大得多,请确保最后检查它)

您可以做的第二个改进是预先按X_IMAY_IMA值对表进行排序。这样,您可以:

  • 当您搜索的值明显过低/过高时,停止扫描每次比较中的第二个表
  • 使用二进制搜索来定位与正在分析的记录接近的记录集

必须有更好的方法来进一步加快这一进程,但无论如何,这些策略应该在您的案例中显示出一些改进

此外,如果您定义这样的函数,也会提高代码的可读性:

def is_close(x, y, delta=5):
    return abs(x-y) <= delta

用它来代替这些长if语句

相关问题 更多 >

    热门问题