计算两个文件中行的差的最有效方法是什么?

时间:2019-01-10 12:36:21

标签: python python-3.x list performance difference

我在python list_alist_b中有两个列表。 list_a有一些图像链接,list_b也有。 99%的项目是相同的,但我必须知道这1%。所有剩余项目都在list_a中,这意味着list_b中的所有项目都在list_a中。我最初的想法是减去所有项目: list_a - list_b = list_c,其中list_c是我的剩余项目。我的代码是:

list_a = []
list_b = []
list_c = []

arq_b = open('list_b.txt','r')
for b in arq_b:
    list_b.append(b)

arq_a = open('list_a.txt','r')
for a in arq_a:
    if a not in arq_b:
        list_c.append(a)

arq_c = open('list_c.txt','w')
for c in list_c:
    arq_c.write(c)

我认为逻辑是正确的,如果我有一些项目,则代码可以快速运行。但是我没有10个项目,或者1.000,甚至100.000。我的78.514.022中有 list_b.txt 个项目,列表78.616.777中有 list_a.txt 个项目。我不知道此表达式的成本:if a not in arq_b。但是,如果我执行此代码,我认为今年不会完成。

我的电脑有8GB,我为交换分配了15GB内存,以免爆炸RAM。

我的问题是,还有另一种方法可以使此操作更有效(更快)?

  • list_a是纵坐标,而list_b不是纵坐标。
  • 每个项目的大小为:images/00000cd9fc6ae2fe9ec4bbdb2bf27318f2babc00.png
  • 顺序无关紧要,我想知道剩余。

4 个答案:

答案 0 :(得分:13)

您可以创建一组第一个文件内容,然后根据您所说的差异使用differencesymmetric_difference

with open("list_a.txt") as f:
    set_a = set(f)

with open("list_b.txt") as f:
    diffs = set_a.difference(f)

如果list_b.txt包含的项目多于list_a.txt,则您要交换它们,或根据需要使用set_a.symmetric_difference(f)

difference(f)可以工作,但仍必须在内部构造一个新的set。性能提升不大(请参见set issubset performance difference depending on the argument type),但效果更短。

答案 1 :(得分:10)

尝试使用集合:

t(apply(df, 1, function(x) {
   inds <- which.max(!is.na(x))
   x[inds:length(x)] <- replace(x[inds:length(x)], is.na(x[inds:length(x)]),
                         mean(x[inds:length(x)], na.rm = TRUE))
  x[1:inds] <- replace(x[1:inds], is.na(x[1:inds]), 0)
  x
}))


#  Date1 Date2 Date3 Date4 Date5
#A   0.0   0.1   0.2   0.2 0.300
#B   0.1   0.2   0.2   0.3 0.200
#C   0.0   0.0   0.0   0.0 0.300
#D   0.1   0.2   0.3   0.1 0.175
#E   0.0   0.0   0.1   0.2 0.100

减去两组is O(n) in the size of the set a的复杂性。

答案 2 :(得分:2)

扩展@ L3viathan的评论 如果元素的顺序不重要,则设置是正确的方法。 这是一个可以适应的虚拟示例:

l1 = [0,1,2,3,4,5]
l2 = [3,4,5]
setL1 = set(l1)  # transform the list into a set
setL2 = set(l2)
setDiff = setl1 - setl2  # make the difference 
listeDiff = list(setDiff)  # if you want to have your element back in a list
如您所见

在python中非常简单。

答案 3 :(得分:2)

如果顺序很重要,您可以将列表与项目索引一起预排序,然后一起遍历它们:

list_2 = sorted(list_2)
diff_idx = []
j = 0
for i, x in sorted(enumerate(list_1), key=lambda x: x[1]):
    if x != list_2[j]:
        diff_idx.append(i)
    else:
        j += 1
diff = [list_1[i] for i in sorted(diff_idx)]

这具有排序算法的时间复杂度,即O(n * log n)。