我的嵌套 For 循环 运行 "faster" 比内联 For 循环

My Nested For loops Run "faster" than inline For loop

对于 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

为什么会这样?我的印象是内联语法本质上只是写出嵌套循环的语法糖,但显然有些不同,我不知道是什么。

这是因为您只是在第一个函数中迭代列表并返回第一个值。第二个是创建一个列表,然后评估该列表的 Truthy 值。为了使它们具有可比性,您需要使用 any 和生成器理解。

def brute_force_inline(x, s1 : list, s2 : list) -> bool:
    return any(a + b == x for a in s2 for b in s1)

P.S 从技术上讲,您的两种方法都是嵌套循环,一种只是使用理解来完成。

这也可以使用 itertools.product 更有效地完成:

from itertools import product

def brute_force_inline(x, s1 : list, s2 : list) -> bool:
    return any(sum(ab) == x for ab in product(s2, s1))

循环确实是相等的,但不是打破它的条件。在第一个嵌套循环中,代码在达到第一个相等时停止。在第二个中,计算所有测试,直到用尽所有组合。

使用理解语法的第一个循环等效于使用生成器和 any,当达到第一个真值时它将停止

return any((a+b==x for a in s2 for b in s1))