Python中的Trie或Set

Python中的Trie或Set,python,set,trie,Python,Set,Trie,我有一张10万字的单子。我希望非常有效地搜索我读到的单词是否存在于已知的单词列表中。在Python中实现时,我可以在Trie或Set中更快地搜索这两个数据结构中的哪一个?如果它只是在或不是在,不需要通过前缀或后缀或任何东西进行检查,只需使用Set即可。它们是内置的,这本身使它们更加方便,并且比用Python手工实现的任何东西都要快。尝试有自己的位置,但对于简单的成员资格测试,集合在几乎所有情况下都很好。不要过早地优化;如果它用一个集合足够快,就没有理由考虑另一个选项。 < P>一个集合哈希表总是

我有一张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()