在巨大的关键字列表中检查单词的最快方法 - Python性能

knu*_*ole 5 python performance search

感谢您惊人的快速反应.Stackoverflow太棒了!

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

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

我创建了一个字典filters:( uniqueid表示即"lk2m3lk4m2",休息是'静态'.)

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

        { "fence" : [
                      { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                    ]}
Run Code Online (Sandbox Code Playgroud)

...并计划迭代字符串中每个单词的过滤器(我必须以大约5000字/秒的速度执行此操作.换句话说,性能是问题所有.

过滤关键字的数量可能会增加到数千,而字符串永远不会超过正常的句子长(即5-20个字).因此,我将迭代字符串中的每个单词,并检查它是否包含在filter-list中.然而,在500句/秒,我仍然在看很多计算.

例如,是否可以对列表进行排序(即列表中的dict键),从而大幅提高性能?是否有我应该使用的C实现(就像我使用cjson具有很好的性能提升)?

对不起有点流动的问题 - 但我应该怎么做这个任务?

编辑:

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

Jos*_*man 4

您可以通过简单地执行filters.has_key(word) 或执行以下操作来确定某个单词是否是过滤器中的键:

subscriptions = filters.get(word)
if subscriptions is not None:
    pass # TODO do something with subscriptions
Run Code Online (Sandbox Code Playgroud)

或者:

try:
    subscriptions = filters[word]
    # TODO do something with subscriptions
except:
    pass # probably don't need to do anything if not present
Run Code Online (Sandbox Code Playgroud)

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

  • 我同意这种方法,但是“filters.has_key(word)”已经被拼写为“word infilters”有一段时间了。:-) (6认同)
  • 是的,分裂几乎肯定会比你需要的要快得多。我用 `a = 'the Quick Brown Fox Jumps Over the Lazy Dog'` 创建了一个字符串,然后运行 ​​`for i in range(100000): _ = a.split()`。同样,100,000 次循环的速度超过了我释放 Enter 键的速度。:-) (2认同)