對于我所在的一個類,我們被要求寫出一個蠻力方法來查找串列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
為什么會這樣?我的印象是行內語法本質上只是寫出嵌套回圈的語法糖,但顯然有些不同,我不知道是什么。
uj5u.com熱心網友回復:
回圈確實相等,但不是打破它的條件。在第一個嵌套回圈中,代碼在達到第一個相等時停止。在第二個中,計算所有測驗,直到用盡所有組合。
使用理解語法的第一個回圈的等價物是使用生成器 and any,當達到第一個真值時它將停止
return any((a b==x for a in s2 for b in s1))
uj5u.com熱心網友回復:
這是因為您只是在第一個函式中迭代串列并回傳第一個值。第二次創建串列,然后評估該串列的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)
PS從技術上講,您的兩種方法都是嵌套回圈,一種是使用理解完成的。
這也可以更有效地使用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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336423.html
