我有一个非常大的列表,我必须运行很多查找这个列表。 更具体地说,我使用一个大的(大于11 Gb)文本文件进行处理,但是有些项目会出现多次,我只在它们出现时先处理它们。 如果我显示了一个模式,我就把它放上去。如果项目再次出现,我会在列表中检查它,如果是,那么我只传递给process,如下所示:
[...]
if boundary.match(line):
if closedreg.match(logentry):
closedthreads.append(threadid)
elif threadid in closedthreads:
pass
else:
[...]
代码本身远远不是最佳的。我的主要问题是“closedthreads”列表包含几百万个项目,整个操作开始变得越来越慢。 我认为在每次append()之后对列表进行排序(或使用“sorted list”对象)可能会有帮助,但我不确定这一点。 最优雅的解决方案是什么?在
你需要保留订单吗?在
如果没有-使用一套。在
如果你这样做-使用一个有序的dict。OrderedDict还允许您存储与其关联的值(例如,流程结果)
但是。。。你需要保留原始值吗?如果你真的这么做的话,你可以看看“dbm”模块(或者买很多内存!)或者,不是存储实际的文本,而是存储SHA-1摘要或类似的东西。如果您所要做的只是确保不运行同一个元素两次,那么这可能会起作用。在
使用集合而不是列表会给你O(1)个查找时间,尽管可能还有其他方法可以优化这一点,这对你的特定数据更有效。在
您可以简单地使用一个集合或哈希表来标记给定的id是否已经出现。它应该可以解决你的问题与O(1)时间复杂性添加和查找一个项目。在
相关问题 更多 >
编程相关推荐