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

时间:2018-03-15 11:10:29

标签: python performance

几周前我刚刚开始编程。我正在处理12个大型数据集,需要对表中特定列的值进行比较。每个表包含x-coordinates(称为“X_IMA”)和y-coordinates(称为“Y_IMA”)以及对此比较过程不重要的其他数据。数据来自4组3个表(我将称之为表11 表12 表13 ,用于数据集表1)

例如,我希望将表格11 表格12 表格13 进行比较,并检查是否存在x-coordinate等于表2 中的x-coordinate表3 (在某个+-范围内)。如果是这样,那么我想检查 y坐标是否相等,如果是这种情况,则认为这是匹配。

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

非常感谢任何输入:)

以下是表格比较中一组(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坐标进行比较,然后从表中提取数据并将其写入文件。

同样,任何输入,甚至是提高计算速度的简单提示都将是一个巨大的帮助!

干杯!

1 个答案:

答案 0 :(得分:0)

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

  • 找出表11和表之间仅匹配的索引。 12
  • 然后仅比较匹配的索引与表13
  • 然后仅将匹配的索引与您的reglist
  • 进行比较

这里最重要的是检查表格的顺序 - 较小的表格应该是第一个(例如,如果table 11比其他表格更大,请确保最后检查) 。

您可以做的第二项改进是事先按X_IMAY_IMA值对表格进行排序。通过这种方式,你可以:

  • 当您要搜索的值太低/太高时,请停止在每次比较中扫描第二个表
  • 使用二进制搜索来查找与您正在分析的记录接近的记录集。

必须有更好的方法来进一步加快这种速度,但无论如何,这些策略应该会对你的情况有所改善。

此外,如果您定义如下函数,它将提高代码的可读性:

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

并使用它而不是这些长篇if语句。