Python 加速循环中的多个条件
考虑以下代码:Python 加速循环中的多个条件,python,language-lawyer,Python,Language Lawyer,考虑以下代码: def transformer(item, conditions, transforms): for item in items: if conditions[0](): item = transforms[0](item) if conditions[1](): item = transforms[1](item) if conditions[2]():
def transformer(item, conditions, transforms):
for item in items:
if conditions[0]():
item = transforms[0](item)
if conditions[1]():
item = transforms[1](item)
if conditions[2]():
item = transforms[2](item)
# ...
yield item
由于该条件是全局的,因此实际上不需要在循环内部有if
,因此一个更快且可怕的不可读替代方案是:
def transformer_fast(item, conditions, transforms):
if not conditions[0]() and not conditions[1]() and not conditions[2]():
for item in items:
yield item
elif conditions[0]() and not conditions[1]() and not conditions[2]():
for item in items:
yield transforms[0](item)
elif not conditions[0]() and conditions[1]() and not conditions[2]():
for item in items:
yield transforms[1](item)
elif not conditions[0]() and not conditions[1]() and conditions[2]():
for item in items:
yield transforms[2](item)
# elif ... (all possible combinations of conditions and transforms)
是否有其他方法可以保持可读性,但避免在循环内执行检查
在C、C++等中,这似乎是预处理器的一个工作。
在LISP、OCaml、Julia(?)中,这可以通过动态创建适当的代码来完成
Python呢?Python有一流的函数,所以我会这样做:
def transformer(item, conditions, transforms):
for cond, tran in zip(conditions, transforms):
if cond():
break # tran is set correctly now
for item in items:
yield tran(item)
或者更简洁地说:
def transformer(item, conditions, transforms):
for cond, tran in zip(conditions, transforms):
if cond():
return map(tran, items)
您可能需要稍作调整,因为您的两个示例的行为方式并不完全相同(本着这种精神,我的也不一样!)。也许它在
…
中隐藏得太多了,但第二个代码旨在涵盖所有可能的情况,包括无转换和多个转换情况。这种方法需要tran
来考虑lambda x:x
的情况,这可能会消耗掉通过避免循环中的条件而获得的任何速度增益。@norok2:我明白了。如果你真的想加快速度,你可能需要使用NUBA或Cython或者编译一个C++模块,所以在某种程度上,这并不重要。