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

Vin*_*ais 21 python performance list python-3.x difference

我有蟒蛇两个列表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)
Run Code Online (Sandbox Code Playgroud)

我认为逻辑是正确的,如果我有一些项目,代码运行得很快.但我没有10项,或1.000,甚至100.000.78.514.022list_b.txt78.616.777我的列表中有项目list_a.txt.我不知道这个表达的代价:if a not in arq_b.但如果我执行此代码,我认为今年不会完成.

我的电脑有8GB,我分配15GB的交换,以免爆炸我的RAM.

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

  • list_a是纵坐标,但list_b没有.
  • 每件商品都有这个尺码: images/00000cd9fc6ae2fe9ec4bbdb2bf27318f2babc00.png
  • 订单无关紧要,我想知道盈余.

Jea*_*bre 14

你可以创建一组第一个文件内容,然后只使用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)
Run Code Online (Sandbox Code Playgroud)

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

difference(f)有效,但仍需要在set内部构建一个新的.不是很好的性能提升(参见set issubset性能差异取决于参数类型),但它更短.


L3v*_*han 11

尝试使用套装:

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

with open("list_b.txt") as f:
    set_b = set(f)

set_c = set_a - set_b

with open("list_c.txt","w") as f:
    for c in set_c:
        f.write(c)
Run Code Online (Sandbox Code Playgroud)

减去两组的复杂度是集合a的大小为O(n).

  • 是的但是用block中的`set(f)`确保它关闭文件 (11认同)
  • 你知道 - 一个打开的文件是一个迭代器 - 因此你可以简单地做`set_a = set(open("list_a.txt"))` (2认同)