好的,对于一个问题,我必须解析两个信息文件,然后比较这些文件。我需要报告任何不一致的数据和一个文件中的任何数据,而不是另一个文件。要做到这一点,我已经对两个数据列表进行了排序,这些数据允许我比较每个列表中的第一个元素,如果它们相等,如果它们不一致则删除它们我报告并删除它们,如果一个或另一个不同我报告哪一个缺少数据,然后将更晚的日期放回去,以便下次比较。
正如您在我的代码中看到的那样(至少我认为并且经过广泛测试),这种方法适用于每个文件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")
答案 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)。