对于我所在的类(class),我们被要求编写一个强力方法来查找列表 S1、S2 中的 2 个元素,并将其添加到指定值x。到目前为止我已经这样写了:
@timing
def brute_force_nested(x, s1 : list, s2 : list) -> bool:
for a in s2:
for b in s1:
if a + b == x:
return True
return False
@timing
def brute_force_inline(x, s1 : list, s2 : list) -> bool:
return bool([ (a,b) for a in s2 for b in s1 if a + b == x ])
但是当我在终端中运行它们时,我得到了很大的时间差异:
>>> brute_force_nested(5123, S1, S2):
func:brute_force_nested took: 0.007085800170898438 sec and gave: True
>>>func:brute_force_inline(5123, S1, S2)
func:brute_force took: 3.0208868980407715 sec and gave: True
为什么会发生这种情况?我的印象是内联语法本质上只是用于编写嵌套循环的语法糖,但有些东西明显不同,我不知道是什么。
最佳答案
循环确实相等,但不是打破循环的条件。在第一个嵌套循环中,当达到第一个相等时,代码停止。在第二个中,计算所有测试,直到用尽所有组合。
与理解语法的第一个循环等效的是使用生成器和 any
,当达到第一个真值时它将停止
return any((a+b==x for a in s2 for b in s1))
关于python - 我的嵌套 For 循环运行 "faster"比内联 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69702333/