设置vs DAWG以检查Python中字典的成员身份

设置vs DAWG以检查Python中字典的成员身份,python,dictionary,set,hashset,dawg,Python,Dictionary,Set,Hashset,Dawg,我需要能够快速检查给定的单词是否在我的字典(英语单词表)中。我只关心检查成员身份的速度(而不是添加或删除元素),内存使用并不是一个真正的问题 最初我使用的是这样一套: words = set(x.strip().lower() for x in open("/usr/share/dict/words").readlines()) if(word in words): ... 我的程序在测试输入上运行大约需要4秒钟。然后,我尝试通过使用DAWG()来优化事情,而不是通过预计算DAWG并对

我需要能够快速检查给定的单词是否在我的字典(英语单词表)中。我只关心检查成员身份的速度(而不是添加或删除元素),内存使用并不是一个真正的问题

最初我使用的是这样一套:

words = set(x.strip().lower() for x in open("/usr/share/dict/words").readlines())
if(word in words):
    ...
我的程序在测试输入上运行大约需要4秒钟。然后,我尝试通过使用DAWG()来优化事情,而不是通过预计算DAWG并对其进行酸洗:

words = pickle.load(open('wordlistDAWG.pyd'))
if(words.word2index(word) is not None):
    ...
在相同的测试输入上,程序运行大约需要40秒(包括加载DAWG的几秒钟,我不关心)。我希望使用DAWG可以让事情运行得更快

也许我对python是如何进行哈希运算的有些理解缺失了——集合是否已经是我想要得到的最好的(O(1)成员资格测试?)而不是DAWG或Trie?一个DAWG会只节省内存而不节省计算吗


非常感谢

通过调用
word2index
,您使用了完美的哈希功能,听起来您似乎不需要它。为什么不改用
exists

通过调用
word2index
,您使用了完美的哈希功能,听起来您似乎不需要它。为什么不改用
exists

我认为,如果将DAWG用作集合替换,它不会节省CPU周期

集合查找是关于集合大小的O(1),而DAWG查找也是关于DAWG项目计数的O(1)。关于查找键长度,DAWG lookup为O(N)(当键在DAWG中时,需要执行len(键)步骤来检查键是否在DAWG中)。关于密钥长度,Set lookup也是O(N)(因为必须计算密钥的散列)。因此,这归结为实施,以及

  • hashmaps通常比其他数据结构(包括dawg和try)更快
  • Python集得到了很好的优化;内置类型的哈希计算也得到了优化;CPython中的set/dict具有unicode键的专用代码路径
当项目不在DAWG中时,DAWG可能具有优势,因为它需要少于len(键)的步骤来检查这一点,并且计算哈希len(键)的步骤总是需要的(如果哈希值未缓存)。但即使在这种情况下,也很难打败内置设置

一个无耻的插件-你也可以试试-但是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


顺便说一句,pyDAWG Python版本的word2index在内部进行了许多dict查找,因此它不会比单个集合查找快。

我认为如果将DAWG用作集合替换,它不会节省CPU周期

集合查找是关于集合大小的O(1),而DAWG查找也是关于DAWG项目计数的O(1)。关于查找键长度,DAWG lookup为O(N)(当键在DAWG中时,需要执行len(键)步骤来检查键是否在DAWG中)。关于密钥长度,Set lookup也是O(N)(因为必须计算密钥的散列)。因此,这归结为实施,以及

  • hashmaps通常比其他数据结构(包括dawg和try)更快
  • Python集得到了很好的优化;内置类型的哈希计算也得到了优化;CPython中的set/dict具有unicode键的专用代码路径
当项目不在DAWG中时,DAWG可能具有优势,因为它需要少于len(键)的步骤来检查这一点,并且计算哈希len(键)的步骤总是需要的(如果哈希值未缓存)。但即使在这种情况下,也很难打败内置设置

一个无耻的插件-你也可以试试-但是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


顺便说一句,pyDAWG Python版本的word2index在内部进行了许多dict查找,因此它不会比单个集合的查找快。

您使用的是c版本还是pythonbtw,读取行效率很低,请尝试此
集合(x.strip().lower()在open中代表x(“/usr/share/dict/words”)
纯Python版本。使用C版本我会获得很大的性能提升吗?您使用的是C版本还是pythonbtw,读线效率很低,请尝试使用此
集(x.strip().lower(),在open(“/usr/share/dict/words”)
纯python版本。C版本的性能会有很大提高吗?python版本似乎没有exists()方法。它确实有一个iter方法,但我想那只会返回一个集合?python版本似乎没有exists()方法。它确实有一个iter方法,但我想那只会返回一个集合?