【问题标题】:How to increase the search performance in huge list in python?如何提高python中巨大列表的搜索性能?
【发布时间】:2020-09-04 09:03:10
【问题描述】:

我有一个巨大的技能列表,我正在这个列表中循环搜索目标技能,如下所示:-

skillset = []
for skill in skills:
                if skill in tokens:
                    skillset.append(skill)

这里 skills 拥有所有技能,我在 tokens(我想搜索)中搜索每个技能,如果找到,则将值附加到另一个列表技能集中。

它工作正常,但花费了太多时间。

那么任何人都可以帮助提高搜索性能吗?

假设技能 = [java, sql, python, php] 和 tokens =['i','know','java','and','php','is','good,'language']

现在我只需要从令牌中获取 java 和 php,为此我在技能数据中搜索每个令牌以获取 php 和 java。

技能列表有 15k 条记录,令牌有许多带有技能的令牌。

【问题讨论】:

  • 对于您正在搜索的容器,请考虑将list 更改为set 以获得更快的搜索性能。
  • @CoryKramer 你能帮忙吗?
  • 技能有多少,令牌有多少?
  • @TedBrownlow,假设技能 =[ java, sql, spring, ptyhon] 现在我必须在列表中搜索 java,所以现在我需要在循环中搜索列表中的每个单词。技能有 15k 技能,令牌有带有令牌形式技能的文本。所以我需要提取技能以匹配技能列表中的技能。

标签: python loops search


【解决方案1】:

一个简单的解决方案如下:

tokenset = set(tokens)
skillset = [s for s in skills if s in tokenset]

如果skillset的顺序不需要与skills的顺序一致,你可以简单地这样做:

skillset = set(akills) & set(tokens)

这将返回一个名为 skillsetset,如果您需要执行除顺序访问和成员资格测试之外的任何操作,您可能需要将其转换为 list

任一解决方案的运行时间都与较大的一组值的大小成正比。第二种解决方案可能会更快,因为它需要执行一组固定的 Python 指令。

【讨论】:

    【解决方案2】:

    你可以为此使用一个集合交集

    >>> skillset = set(tokens).intersection(skills)
    >>> skillset     
    {'php', 'java'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多