我想使用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。
答案 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是一个生成器!
没有。 all
和any
被短路,但map
不是:它无法知道它是从一些短路的代码中调用的,并且总是只返回完整清单。
解决方案是使用生成器表达式:
all(func(i) for i in iterables)
这会造成短路。
答案 3 :(得分:1)
“all / any”确实使用短路。
但它不会通过map()命令传播,
要做到这一点,将地图更改为生成器
all(func(x) for x in iterable)
应该有效