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

2024-09-30 04:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的列表,我必须运行很多查找这个列表。 更具体地说,我使用一个大的(大于11 Gb)文本文件进行处理,但是有些项目会出现多次,我只在它们出现时先处理它们。 如果我显示了一个模式,我就把它放上去。如果项目再次出现,我会在列表中检查它,如果是,那么我只传递给process,如下所示:

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

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


Tags: 项目列表ifmatchline模式process文本文件
3条回答

你需要保留订单吗?在

如果没有-使用一套。在

如果你这样做-使用一个有序的dict。OrderedDict还允许您存储与其关联的值(例如,流程结果)

但是。。。你需要保留原始值吗?如果你真的这么做的话,你可以看看“dbm”模块(或者买很多内存!)或者,不是存储实际的文本,而是存储SHA-1摘要或类似的东西。如果您所要做的只是确保不运行同一个元素两次,那么这可能会起作用。在

使用集合而不是列表会给你O(1)个查找时间,尽管可能还有其他方法可以优化这一点,这对你的特定数据更有效。在

closedthreads = set() 
# ...

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

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

相关问题 更多 >

    热门问题