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

标签 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。我的 list_b.txt78.616.777 中有 78.514.022 项在我的列表 list_a.txt 中。我不知道这个表达式的代价:if a not in arq_b。但是如果我执行这段代码,我认为不会在今年完成。

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

我的问题是,还有另一种方法可以让这个操作更高效(更快)吗?

  • list_a 是纵坐标,而 list_b 不是。
  • 每个项目的尺寸如下:images/00000cd9fc6ae2fe9ec4bbdb2bf27318f2babc00.png
  • 顺序无所谓,我想知道剩余的。

最佳答案

您可以创建一组第一个文件内容,然后根据您所说的差异使用 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 ),但更短。

关于python - 计算两个文件的行差异的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54128876/

相关文章:

python - 使用python创建新文本文件时出错?

python - 使用 python 中的列表推导就地修改列表的一部分

python - 如何使用变量将数据帧传递给函数?

python - Caffe:如何通过代码获取 `solver.prototxt`参数?

python - pyodbc 和 mySQL

python - 如何用零替换数组中的所有负数

python - 使用 python 3 将列表添加为树的子级

python - 赋值引发 list.index 异常

python - 连接正则表达式从子进程 STDERR 检索到的字符串会导致困惑

python - 登录网站并下载文件