2014-02-24 11 views
2

我想使用all(map(func, iterables)),因爲很明顯,但我對這種方法是否優化非常感興趣?例如,如果任何計算結果map()不是True映射應該停止。從我的項目Python中是否存在全部(map(...))優化?

例子:

for item in candidate_menu: 
    if not item.is_max_meals_amount_ok(daily_menus): 
     return False 
return True 

我更喜歡使用功能般的風格:

all(map(operator.methodcaller('is_max_meals_amount_ok', daily_menus), candidate_menu) 

我有沒有在Python all(map(...))any(map(...))任何優化?

編輯:船上的Python 2.7。

+1

標準庫中的'any'和'all'都是懶惰的 – jonrsharpe

+1

'map()'在Python 3上是懶惰的。 – jfs

回答

5

除了all(func(i) for i in iterable)別人建議,您也可以使用itertools.imap - all(imap(func, iterable))。與map相比,imap是一個迭代器,因此如果all停止消耗,它將不會再向前推進。

+0

這就是我需要的。謝謝! –

4

如果你想在Python 2.x的懶惰評價,嘗試:

all(func(i) for i in iterables) 

這將不建全名單,然後評估,不像map。在Python 3.x中,map會返回一個迭代器,所以默認情況下會延遲。

1

編輯:這個答案對Python 3來說不是真的,其中map是一個生成器!

all號和any短路,但map不是:它無法知道它是從一個位的代碼,不會短路叫,始終只是返回的完整列表。

的解決方案是使用生成器表達式:

all(func(i) for i in iterables) 

即不短路。

1

「all/any」確實使用短路。

,但它不會在整個地圖()命令傳播,

要做到這一點,改變地圖到發電機

all(func(x) for x in iterable) 

應該工作