Python:搜索长字符串是否在字符串列表中的最快方法

时间:2018-08-07 23:46:58

标签: python search

我从存储的文本文件中输入了大约2-5百万个字符串,每个字符串约400个字符。 在将重复项添加到我要检查的列表之前,我需要检查重复项(不必是列表,可以是任何其他数据类型,从技术上讲,列表是一组,因为所有项都是唯一的。)

我可以预期最大数据量中约有0.01%是不唯一的,我需要将它们过滤掉。

我想知道是否有更快的方法可以检查项目是否存在于列表中,而不是:

a=[]
for item in data:
    if item not in a:
        a.add(item)

我不想失去订单。

散列会更快(我不需要加密)吗?但随后,我必须维护一个哈希表,以首先检查所有值。 我有什么想念的吗?

我使用的是python 2,最多可以使用python 3.5。

2 个答案:

答案 0 :(得分:2)

很难回答这个问题,因为它一直在变化;-)我正在回答的版本询问是否有比以下方法更快的方法:

a=[]
for item in data:
    if item not in a:
        a.add(item)

那太慢了,在len(data)中花费的时间是平方。在任何版本的Python中,以下情况都会在len(data)中采用预期情况下的线性时间:

seen = set()
for item in data:
    if item not in seen:
        seen.add(item)
        emit(item)

其中emit()会执行您喜欢的任何操作(附加到列表,写入文件等等)。

在评论中,我已经指出了使用有序词典来实现相同目的的方法(无论是通过Python 3.7中的语言保证还是通过OrderedDict包中的collections类型进行排序)。不过,上面的代码是内存效率最高的。

答案 1 :(得分:-1)

您可以尝试一下,

a = list(set(data))

列表是元素的有序序列,而集合是元素的无序列表。