字典、集合还是不可变集合(frozenset)?

10

我有一个大型的数据集,约有1000万条记录,我的程序需要进行很多成员资格检查...

if a in data:
    return True
return False

目前我拥有的数据是字典项,其所有值均为“1”。

我还有一个使用算法来找到相同信息的程序,但目前它比字典方法慢,然而我预计数据的大小将继续增长...

对于我的当前字典解决方案,将data作为frozenset、set(或其他什么?)类型更快吗?

而对于未来,如何在可哈希类型的大小增加时检查成员资格的速度是否与之相关?一亿条记录的字典仍然快吗?


5
一个有10亿条目的词典还能快吗?当然不能。 - K DawG
6
顺便提一下:你的这三行代码等同于 return a in data - Hyperboreus
3个回答

7

关于原则

如果你期望数据不断增长,就不能使用frozenset。

与字典相比,存储一个元素在set中的测试会更小一些。查找set中的元素速度类似于字典,因为set的键和项都被哈希存储,并且总是唯一的。如果您不需要与用户名相关的数据,请使用set。

实际操作中...

当你处理那么多条数据时,将数据移动到数据库中。如果尝试将所有数据存储在内存中并读取它们,则最终会耗尽内存。使用数据库,可以发出特定的查询来检查成员身份。真的,请将这些数据放入数据库中。


4
在这种情况下提到使用数据库可能会导致“MemoryError”,这是一个好主意。+1 - K DawG
1
集合比字典更快的原因是什么? - BrenBarn
@BrenBarn 你是正确的,现在想一想它确实不是。回答已编辑。 - RyPeck

2

在哈希表(无论是字典还是集合)中,每个条目都有几个字节的开销,因此如果有数十亿个条目,除非应用程序具有32Gb以上的内存,否则您将遇到交换问题。我建议寻找一个快速的数据库。

对于frozenset,您还需要在创建时以某种可接受的形式将所有数据保存在内存中,这可能会使所需的内存量翻倍。


2

对于这么多数据,RyPeck是正确的 - 数据库会更好地完成工作。

还有一点: 你写的东西似乎有些奇怪: 如果您使用字典来存储成员的对象,那么字典中的键值对的值是“1”吗?字典的键值对不应该是:“a”的“a”的id,其中'a'是对象吗。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接