加快列表中的查找项(通过Python)

时间:2014-01-15 14:27:03

标签: python performance list

我有一个非常大的列表,我必须为此列表运行大量查找。 更具体地说,我处理一个大的(> 11 Gb)文本文件进行处理,但有些项目出现不止一次,我只在它们出现时才处理它们。 如果模式显示,我处理它,并将其放入列表。如果该项目再次出现,我会在列表中检查它,如果是,那么我只是传递到进程,如下所示:

[...]
if boundary.match(line):
    if closedreg.match(logentry):
       closedthreads.append(threadid)
    elif threadid in closedthreads:
        pass
    else:
[...]

代码本身远非最佳。我的主要问题是'closedthreads'列表包含几百万个项目,整个操作开始变得越来越慢。 我认为在每个append()之后对列表进行排序(或使用'排序列表'对象)可能会有所帮助,但我不确定这一点。 什么是最优雅的溶液?

3 个答案:

答案 0 :(得分:3)

您可以简单地使用一个集合或哈希表来标记是否已经出现了给定的ID。它应该通过添加和查找项目的O(1)时间复杂度来解决您的问题。

答案 1 :(得分:2)

使用集合而不是列表将为您提供O(1)查找时间,尽管可能有其他方法可以优化此方法,以便更好地处理您的特定数据。

closedthreads = set() 
# ...

if boundary.match(line):
    if closedreg.match(logentry):
       closedthreads.add(threadid)
    elif threadid in closedthreads:
        pass
    else:

答案 2 :(得分:1)

您需要保留订购吗?

如果不是 - 请使用一套。

如果你这样做 - 使用OrderedDict。 OrderedDict允许您存储与其关联的值(例如,处理结果)

但是......你需要保留原始值吗?如果你绝对做(或购买大量内存!),或者不存储实际文本,你可以查看'dbm'模块,存储SHA-1摘要,或类似的东西。如果您只想确保两次运行相同的元素,那可能会有效。

相关问题