虽然循环适用于中小型数据,但不适用于大量数据。 (Python)的

时间:2017-07-13 19:19:39

标签: python

好的,对于一个问题,我必须解析两个信息文件,然后比较这些文件。我需要报告任何不一致的数据和一个文件中的任何数据,而不是另一个文件。要做到这一点,我已经对两个数据列表进行了排序,这些数据允许我比较每个列表中的第一个元素,如果它们相等,如果它们不一致则删除它们我报告并删除它们,如果一个或另一个不同我报告哪一个缺少数据,然后将更晚的日期放回去,以便下次比较。

正如您在我的代码中看到的那样(至少我认为并且经过广泛测试),这种方法适用于每个文件100-200行的数据集。当我变大,如1,000-1,000,000,需要很长时间来报告。

我很难理解我的while循环会导致这种情况。见下文。 拆分代表日期(split [0]),然后是一条信息(split [1])。

任何帮助都会受到赞赏,这实际上是我的第一个python程序。

tldr;出于某种原因,我的程序在小数据集中工作正常但较大的数据集无法正常运行。它也不是sort(),(即我的第一个循环中的某些东西导致运行时间变得糟糕)。

ws1.sort()
ws2.sort()

while ws1 and ws2:
    currItem1 = ws1.pop(0)
    currItem2 = ws2.pop(0)
    if currItem1 == currItem2:
        continue
    splitWS1 = currItem1.split()
    splitWS2 = currItem2.split()
    if splitWS1[0] == splitWS2[0] and splitWS1[1] != splitWS2[1]:
        print("Inconsistent Data (" + splitWS1[0] + "): A: " + splitWS1[1] + " B: " + splitWS2[1])
        continue
    elif splitWS1[0] < splitWS2[0]:
        print("Missing Data (" + splitWS1[0] + ") in data set A but not in B")
        ws2.insert(0, currItem2)
        continue
    elif splitWS1[0] > splitWS2[0]:
        print("Missing Data (" + splitWS2[0] + ") in data set B but not in A")
        ws1.insert(0, currItem1)
        continue
while ws2:
    currItem2 = ws2.pop(0)
    splitWS2 = currItem2.split()
    print("Missing data (" + splitWS2[0] + ") in data set B but not in A")
while ws1:
    currItem1 = ws1.pop(0)
    splitWS1 = currItem1.split()
    print("Missing data (" + splitWS1[0] + ") in data set A but not in B")

1 个答案:

答案 0 :(得分:1)

可能这两行:

currItem1 = ws1.pop(0)
currItem2 = ws2.pop(0)

当您删除列表中的第一项时,您必须重建整个列表。如果你尝试使用(在循环之外):

listA = list(reversed(ws1.sorted()))

然后使用

在循环中处理
currItem1 = listA.pop()

对于这两个列表中的每一个,您可以节省大量处理时间。

基本上,删除列表中的第一项是O(n),而删除列表中的最后一项是O(1)。在循环中执行此操作意味着它是O(n ^ 2),但如果您事先反转列表一次,然后删除列表中的最后一项,则它是O(n)。