【问题标题】:Nested for loop taking much time in Python (Optimization)嵌套 for 循环在 Python 中花费大量时间(优化)
【发布时间】:2018-05-21 12:27:30
【问题描述】:

我有一个带有嵌套 for 循环的 python 代码,它花费了太多时间,考虑使用像 dict = {'110': ('jade'), '2': ('amber'), '111' : ('harry')} 这样的字典

这是我的代码-

all_keys = dict.keys()
for number in all_keys:
    for more_number in all_keys:
        if SequenceMatcher(None, number, more_number).ratio() > 0.5:
            dict[number] = dict[number].union(dict[more_number])

输出:-

dict = {'110' : ('jade', 'harry'), '2' : ('amber')}

这段代码正在做的是检查键的匹配概率是否大于 0.5,如果是,则将两个键添加到一个集合中并存储它。对于更多数据,出于显而易见的原因,它需要花费大量时间。有什么办法优化吗?

【问题讨论】:

  • 您发布的代码不起作用。 (字符串没有.union
  • @AKX 它是字符串元组的字典?
  • 不要使用dict作为变量名...
  • @PatrickArtner 不,不是。 ('jade') 是括号中的字符串,('jade',) 是 1 成员元组。此外,元组也没有union。 (设置。)
  • @AKX 谢谢,我的错

标签: python performance for-loop optimization


【解决方案1】:

首先,您的代码在内循环的每次迭代中分配一个SequenceMatcher 的实例,总共分配O(N^2)

考虑到从中取出的所有内容都是单个值,应该可以使其无状态并使用单个预分配实例。

此外,您可以使用 for k,v in d.items(): 进行迭代,而不是在最内层循环中迭代键并支付不必要的查找成本(节省 O(N^2) 查找)。

最后,我几乎可以肯定(需要查看SequenceMatcher 的代码才能确定)有可能比O(N^2) 做得更好(至少与O(N log(N)) 一样)。

【讨论】:

  • 好吧,这很有帮助 bobah,我更改了内部循环,但没有多大帮助。
  • @l0n3_w01f - 最新的代码是什么样的,SequenceMatcher 里面有什么?
  • 我将内部循环从迭代到列表更改为for k,v in d.items():,这也是一个列表。 SequenceMatcher 是用于比较两个字符串的模块,我认为它会遍历字符串中的每个字符以查找匹配概率。
猜你喜欢
  • 2021-06-05
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多