【发布时间】:2021-10-25 02:40:52
【问题描述】:
对于我所在的一个类,我们被要求编写一个蛮力方法,用于在列表 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
为什么会这样?我的印象是内联语法本质上只是写出嵌套循环的语法糖,但显然有些不同,我不知道是什么。
【问题讨论】:
-
您的嵌套 for 循环在找到第一个匹配项后立即停止,这要归功于返回;列表推导用所有匹配拳头创建一个列表,然后给它布尔函数