簡體   English   中英

為Python傳遞生成器vs列表

[英]Passing generator vs list for Python any

給出一個整數列表,如integers = [1, 2, 3, 4, 5, 6]

我想知道使用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)

將一個生成器而不是列表推導傳遞給any all更好的。 這兩方面的功能都可以短路,即any將盡快停止,因為它遇到了True價值,以及all為它遇到一個,就立即停止False值。 如果你傳遞列表解析,則必須在any / all可以開始工作之前構建整個列表,但是如果你將它們傳遞給生成器,那么將只生成所需的值。 因此,您不僅可以使用生成器來節省RAM,還可以節省大量的執行時間。

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

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

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可能是錯誤的工具......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM