python—比较列表和搜索列表中的术语的最快方法

python—比较列表和搜索列表中的术语的最快方法,python,string,list,comparison,tuples,Python,String,List,Comparison,Tuples,现在,我正在编写一些python代码,需要进行如下类似的列表比较: small_list = ["string"]*3 big_list = ["string"]*600000 big_list_excludes = ["string"]*600000 final_lines = [] for small in small_list: final_lines = [line for line in big_list if small in big_list] for excl

现在,我正在编写一些python代码,需要进行如下类似的列表比较:

small_list = ["string"]*3
big_list = ["string"]*600000
big_list_excludes = ["string"]*600000

final_lines = []

for small in small_list:
    final_lines = [line for line in big_list if small in big_list]
    for exclude in big_list_excludes:
        final_lines = [line for line in final_lines if exclude not in final_lines]
到目前为止,名单还不是很大。执行时间是瞬间的。然而,大名单现在可以包含大约60000个条目,“大名单”也可以。有没有人知道如何缩短上述时间,使其更快?还有-除了可以加快执行速度的列表之外,有人知道我可以使用其他数据类型吗?我确实需要添加到这些列表中,但我不需要更改顺序

此外,我更希望这些列表比较不区分大小写。在此之前,我通过以下方式实现了这一点:

for small in small_list:
    for line in big_list:
        if small.upper() in line.upper():
            final_lines.append(line)

我相当肯定这会大大降低速度。如果有人知道一种更有效的方法,那也会很有帮助。

集合绝对是一种快速实现的简单方法。这不是一个真正的性能测试,但这个小程序在2.7GHz i7 iMac上即时运行,有10000个项目:

from sets import Set

inc = set(open('big_list.txt').read().splitlines())
excl = set(open('big_list_excludes.txt').read().splitlines())
sm = set(open('small_list.txt').read().splitlines())

sm.intersection_update(inc)
sm.difference_update(excl)

print sm

不过,不区分大小写。

集合绝对是快速完成此任务的简单方法。这不是一个真正的性能测试,但这个小程序在2.7GHz i7 iMac上即时运行,有10000个项目:

from sets import Set

inc = set(open('big_list.txt').read().splitlines())
excl = set(open('big_list_excludes.txt').read().splitlines())
sm = set(open('small_list.txt').read().splitlines())

sm.intersection_update(inc)
sm.difference_update(excl)

print sm

但不区分大小写。

列表中的所有项目都是唯一的吗?如果是这样,你可以使用集合,因为你要寻找的是交叉点和差异。理论上,它们应该是唯一的。。。然而,没有真正的保证。有可能会有副本。是否需要保留副本?或者,“abc”仅仅存在于小名单和大名单中就足够了吗?从包含重复项的列表中创建一个集合只会删除多余的重复项。我明白你的意思。不,它们不需要保存。与列表操作相比,设置操作要快多少?不确定,但测试成员身份时应该快得多,这正是您正在做的。列表中的所有项目都是唯一的吗?如果是这样,你可以使用集合,因为你要寻找的是交叉点和差异。理论上,它们应该是唯一的。。。然而,没有真正的保证。有可能会有副本。是否需要保留副本?或者,“abc”仅仅存在于小名单和大名单中就足够了吗?从包含重复项的列表中创建一个集合只会删除多余的重复项。我明白你的意思。不,它们不需要保存。与列表操作相比,设置操作要快多少?不确定,但测试成员身份时应该要快得多,这正是您正在做的。我将使用setopen'big_list.txt',它将调用iteropenfilename并迭代行,因为这样您就不必将整个文件加载到字符串中。要区分大小写,我想不出比setopenline.lower更好的方法来处理open'big_list.txt'中的行。同意setopen'big_list.txt'这是从另一个脚本复制和粘贴时发生的事情!在区分大小写方面,要测试的是,按照您上面建议的方式进行比较快,还是区分大小写进行交叉和差异比较快,然后将结果小写并删除任何重复项。我将使用setopen'big_list.txt',它将调用iteropenfilename并在行上进行迭代,因为这样您就不必将整个文件加载到字符串中。要区分大小写,我想不出比setopenline.lower更好的方法来处理open'big_list.txt'中的行。同意setopen'big_list.txt'这是从另一个脚本复制和粘贴时发生的事情!在区分大小写方面,要测试的是,按照您上面建议的方式执行,还是区分大小写执行交叉和差异,然后将结果小写并删除任何重复项,速度更快。