Python中是否有全部(map(...))优化?

Via*_*kyi 5 python optimization map python-2.7

我想使用all(map(func, iterables)),因为它很清楚,但我对这种方法是否优化非常感兴趣?例如,如果任何map()未True映射的计算结果应该停止.

我的项目示例:

for item in candidate_menu:
    if not item.is_max_meals_amount_ok(daily_menus):
        return False
return True
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用类似功能的风格:

all(map(operator.methodcaller('is_max_meals_amount_ok', daily_menus), candidate_menu)
Run Code Online (Sandbox Code Playgroud)

我有任何的优化all(map(...))或any(map(...))在Python?

编辑:板载Python 2.7.

Mac*_*Gol 8

除了all(func(i) for i in iterable)别人建议外,您还可以使用itertools.imap- all(imap(func, iterable)).相比之下map,imap迭代器是一个迭代器,如果all停止消耗它,它将不再进一步发展.


Rem*_*ich 6

编辑:这个答案对于Python 3来说是不正确的,其中map是一个生成器!

不。all和any是短路的,但map不是:它不知道它是从一些短路代码中调用的,并且总是只返回完整列表。

解决方案是使用生成器表达式:

all(func(i) for i in iterables)
Run Code Online (Sandbox Code Playgroud)

那确实会短路。


jon*_*rpe 5

如果你想在Python 2.x中进行延迟评估,请尝试:

all(func(i) for i in iterables)
Run Code Online (Sandbox Code Playgroud)

这不会构建整个列表然后评估,不像map.在Python 3.x中,map返回一个迭代器,因此默认情况下是惰性的.