2016-03-04 34 views
3

鑑於整數如integers = [1, 2, 3, 4, 5, 6]傳發電機VS列表爲Python任何

我想知道如果有,即使在使用Python的any()功能列表編號列表。我的問題是,如果它是更有效地傳遞一個列表解析的結果,像這樣:

evens = [each for each in integers if each % 2 == 0] 
has_even = any(evens) 

與使用發電機,例如:

has_even = any(each for each in integers if each % 2 == 0) 

回答

2

最好是通過一臺發電機比一個列表解析anyall。這兩種功能都可能發生短路,即any會在遇到True值時立即停止,並且all會在遇到False值時立即停止。如果你通過他們一個列表理解,整個列表必須在any/all可以開始工作之前建立,但是如果你傳遞給他們一個生成器,那麼只會生成所需的值。因此,您不僅可以使用生成器保存RAM,還可以節省大量的執行時間。

您的發電機可以變得更高效; if部分是多餘的。

has_even = any(each % 2 == 0 for each in integers) 
2

any與發電機是最有效的方法,在這裏,因爲它不會分配所有偶數的列表,而且它會停在第一個偶數,即使不考慮別人。輸入也可以是一個生成器(例如從文件中讀取數字),在這種情況下,如果您停止讀取輸入,則保存會更大。

any與發電機也是非常具有可讀性,尤其是如果你定義一個even謂詞...

def even(x): 
    return x % 2 == 0 

if any(even(x) for x in integers): 
    ... 

可讀性應該是多數軟件主要考慮的因素(目前電腦一般都非常快)。

如果你的眼睛與功能訓練的方法則更加可讀的版本可能是

if any(filter(even, integers)): 
    ... 

與Python 3中也同樣有效(一旦結果不知道從numbers提取輸入)。

但是,請注意,如果這種計算效率是您最重要的關注,那麼Python可能是錯誤的工具...