在庞大的关键字列表中检查单词的最快方法Python performan

2024-04-29 07:39:13 发布

您现在位置:Python中文网/ 问答频道 /正文

感谢您的快速反应。Stackoverflow太棒了!

我需要检查一个单词(或者更确切地说是数千个单词)是否与包含关键字的dict匹配。在

例如,假设我有一个字符串:"The fluffy fox jumped the friggin fence."我需要对照关键字dict检查字符串中的每个单词,如果匹配,则返回所有值。在

我创建了一个dict filters:(uniqueid的意思是“lk2m3lk4m2”,其余的是“static”。)

filters:
        { "fox" : [
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' },
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                  ]},

        { "fence" : [
                      { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                    ]}

…并计划对字符串中每个单词的过滤器进行迭代(我必须以每秒5000个单词的速度执行此操作。换句话说,绩效是最重要的问题。在

过滤关键字的数量可能会增加到数千个,而字符串永远不会超过一个正常的句子长度(即5-20个单词)。因此,我将遍历字符串中的每个单词,并检查它是否包含在过滤器列表中。然而,在500句/秒的速度下,我仍然需要大量的计算。在

例如,是否可以对列表进行排序(例如,dict在list中的键),从而显著提高性能?有没有我应该使用的C实现(比如我使用cjson获得了很好的性能增益)?在

很抱歉这个问题有些不稳定,但我该怎么做这个任务呢?在

编辑:

预期输入:
"The fluffy fox jumped the friggin fence."
预期输出:
{ 'subscription' : 'flskdmfslk32232', 'link' : 'sfdksmfls22323' }, { 'subscription' : '3023940fsdf', 'link' : 'sdflsfm223' }
(即每个匹配关键字下列出的订阅)


Tags: the字符串link关键字单词filtersdictsubscription
2条回答

您可以通过简单地filters.has_键(文字)或通过做:

subscriptions = filters.get(word)
if subscriptions is not None:
    pass # TODO do something with subscriptions

或者:

^{pr2}$

不需要迭代过滤器中的每个条目。相反,您需要拆分输入字符串,将每个单词添加到一个集合中(以消除重复),然后在集合上迭代以在过滤器字典中查找每个单词。在

在Python中最快的方法是使用字典查找句子中的每个单词,然后累加和关联的值。主数据结构可能如下所示:

filters = {
    "fox" : (
              ('uniqueid1', 'uniqueid2'),
              ('uniqueid3', 'uniqueid4'),
            ),
    "fence" : (
                ('uniqueid5', 'uniqueid6'),
              ),
          }

使用这种方式(在8位字符上):

^{pr2}$

或者,它可能会更快(是时候找出答案),这样可以避免双重字典查找:

from string import punctuation

def map_words(sentence):
    for word in sentence.translate(None, punctuation).split():
        try:
            yield filters[word]
        except KeyError:
            pass

sentence = 'The fluffy fox jumped the friggin fence.'
print [v for v in map_words(sentence)]

不管怎样,这就是输出:

[(('uniqueid1', 'uniqueid2'), ('uniqueid3', 'uniqueid4')), (('uniqueid5', 'uniqueid6'),)]

相关问题 更多 >