【问题标题】:python - fastest way to compare lists and search for term in listpython - 比较列表和在列表中搜索术语的最快方法
【发布时间】:2013-07-09 20:11:43
【问题描述】:

现在我正在编写一些 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]

到目前为止,列表还不是很大。执行已被分秒。但是,big_list 现在可以包含大约 60,000 个条目,“big_list_excludes”也可以。有谁知道缩短上述内容的方法,以便更快?另外 - 除了可以加快执行速度的列表之外,有没有人知道我可以使用的不同数据类型?我确实需要添加到这些列表中,但我不需要更改顺序。

另外,我希望这些列表比较不区分大小写。以前我通过执行以下操作来完成此操作:

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

我相当肯定这会大大降低速度。如果有人知道如何更有效地做到这一点,那也会有所帮助。

【问题讨论】:

  • 列表中的所有项目都是唯一的吗?如果是这样,您可以使用集合,因为您正在寻找的是交叉点和差异。
  • 理论上它们应该是唯一的......但是没有真正的保证。有重复是可能的。
  • 是否需要保留重复项?或者,“abc”仅存在于small_listbig_list 中是否足够?从具有重复项的列表中创建一个集合只会删除多余的重复项。
  • 我明白你在说什么。不,它们不需要保存。集合操作比列表操作快多少?
  • 不确定,但他们应该更快更快地测试会员资格,这正是你正在做的。

标签: python string list comparison tuples


【解决方案1】:

套装绝对是一种快速完成此操作的简单方法。不是真正的性能测试,但这个小程序可以立即运行(在 2.7GHz i7 iMac 上),包含 10,000 个项目:

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

但不区分大小写。

【讨论】:

  • 我会使用set(open('big_list.txt')),它将调用iter(open(filename)) 并遍历行,因为这样您就不必将整个文件加载到字符串中。为了不区分大小写,我想不出比set(open(line.lower() for line in open('big_list.txt'))) 更好的方法。
  • 同意set(open('big_list.txt'))(当您从另一个脚本复制并粘贴时会发生这种情况!)在区分大小写方面,要测试的是按照您建议的方式进行操作是否更快上面,或区分大小写的交集和差异,然后将结果小写并删除所有重复项。
猜你喜欢
  • 2011-08-25
  • 2019-09-06
  • 2017-08-17
  • 2011-05-18
  • 1970-01-01
  • 2012-05-23
  • 2015-07-29
  • 2015-06-11
  • 2016-09-27
相关资源
最近更新 更多