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

时间:2014-02-24 20:19:39

标签: python python-2.7 optimization map

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

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

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

我在Python中对all(map(...))any(map(...))进行了优化吗?

编辑:Python 2.7。

4 个答案:

答案 0 :(得分:8)

除了其他人建议的all(func(i) for i in iterable)之外,您还可以使用itertools.imap - all(imap(func, iterable))。与map相比,imap是一个迭代器,因此如果all停止使用它,它将无法继续前进。

答案 1 :(得分:5)

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

all(func(i) for i in iterables)

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

答案 2 :(得分:3)

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

没有。 allany被短路,但map不是:它无法知道它是从一些短路的代码中调用的,并且总是只返回完整清单。

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

all(func(i) for i in iterables)

这会造成短路。

答案 3 :(得分:1)

“all / any”确实使用短路。

但它不会通过map()命令传播,

要做到这一点,将地图更改为生成器

all(func(x) for x in iterable)

应该有效