Python中的Trie或Set
我有一张10万字的单子。我希望非常有效地搜索我读到的单词是否存在于已知的单词列表中。在Python中实现时,我可以在Trie或Set中更快地搜索这两个数据结构中的哪一个?如果它只是在或不是在,不需要通过前缀或后缀或任何东西进行检查,只需使用Set即可。它们是内置的,这本身使它们更加方便,并且比用Python手工实现的任何东西都要快。尝试有自己的位置,但对于简单的成员资格测试,集合在几乎所有情况下都很好。不要过早地优化;如果它用一个集合足够快,就没有理由考虑另一个选项。 < P>一个集合哈希表总是更好的,如果你只需要检查一个单词是否已经存在。摊销时间复杂度是常数。Python中的Trie或Set,python,set,trie,Python,Set,Trie,我有一张10万字的单子。我希望非常有效地搜索我读到的单词是否存在于已知的单词列表中。在Python中实现时,我可以在Trie或Set中更快地搜索这两个数据结构中的哪一个?如果它只是在或不是在,不需要通过前缀或后缀或任何东西进行检查,只需使用Set即可。它们是内置的,这本身使它们更加方便,并且比用Python手工实现的任何东西都要快。尝试有自己的位置,但对于简单的成员资格测试,集合在几乎所有情况下都很好。不要过早地优化;如果它用一个集合足够快,就没有理由考虑另一个选项。 < P>一个集合哈希表总是
trie对于其他用例来说是有意义的,例如查找以某个前缀开头的已经存在的单词。要将其他朋友的评论加起来,set肯定更可取 编写了此基准测试,将python集与marisa trie进行比较,这是: Python的静态内存高效Trie-like结构 结果接近10级,有利于set: 代码:
理论上是一个集合,O1。事实上,这要视情况而定。为什么不试试呢?trie还可以提供O1查找。集合所需的trie查找和哈希操作在搜索项的长度上都是线性的。@chepner:Yar。差异出现在非理论方面。集合散列通常只是几个半随机的访问来查找非冲突的存储桶。trie涉及遍历一棵树,这意味着大量有效的随机内存访问。在实践中,我希望trie在单词存在的情况下会稍微慢一点,在没有提前拒绝的情况下会稍微快一点,但在99%需要这样做的程序中,差异是无关紧要的。而我的期望毫无意义;他们必须分析他们是否在速度真正重要的1%范围内。哪种结构在您的数据集上运行得更快?假设性问题在堆栈溢出上不起作用。我们怎么能比你的电脑更了解答案呢?我们希望您在发布问题之前进行基础研究;如果您对此问题有任何疑问,请发布计时结果。@ShadowRanger根据树的构造方式,开销可能最小。我的观点是,渐进地说,trie并不比set差。
function [trie_performance_test] finished in 22 ms
function [set_performance_test] finished in 2 ms
# pip install marisa-trie
import functools
from timeit import default_timer as timer
import marisa_trie
import requests
word_site = "http://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain"
response = requests.get(word_site)
WORDS = [w.decode('utf8') for w in response.content.splitlines()]
def timeit(func):
@functools.wraps(func)
def newfunc(*args, **kwargs):
startTime = timer()
func(*args, **kwargs)
elapsedTime = timer() - startTime
print('function [{}] finished in {} ms'.format(
func.__name__, int(elapsedTime * 1000)))
return newfunc
@timeit
def trie_performance_test(words=WORDS):
trie = marisa_trie.Trie(words)
for key in words:
key_id = trie.get(key)
@timeit
def set_performance_test(words=WORDS):
words_set = set(words)
for key in words:
if key in words_set:
pass
trie_performance_test()
set_performance_test()