【发布时间】:2013-02-03 21:58:01
【问题描述】:
我需要能够快速检查给定单词是否在我的字典中(英语单词表)。我只关心检查成员的速度(不添加或删除元素),内存使用并不是真正的问题。
原来我用的是这样的一套:
words = set(x.strip().lower() for x in open("/usr/share/dict/words").readlines())
if(word in words):
...
我的程序大约花了。在测试输入上运行 4 秒。然后,我尝试通过使用 DAWG (http://pypi.python.org/pypi/pyDAWG) 来优化事物,而不是预先计算 DAWG 并对其进行酸洗:
words = pickle.load(open('wordlistDAWG.pyd'))
if(words.word2index(word) is not None):
...
在相同的测试输入上,程序运行大约需要 40 秒(包括几秒钟来加载我不关心的 DAWG)。我希望使用 DAWG 能让事情运行得更快!
也许我对 python 如何散列事物缺乏一些了解——一个集合是否已经是我将获得的最好的(O(1) 成员资格测试?)而不是 DAWG 或 Trie? DAWG 会节省内存而不是计算吗?
非常感谢!
【问题讨论】:
-
你用的是c版还是python版
-
顺便说一句,readlines 效率低,试试这个
set(x.strip().lower() for x in open("/usr/share/dict/words")) -
纯python版本。使用 C 版本会大大提高性能吗?
标签: python dictionary set hashset dawg