我的嵌套 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))
对于 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))