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++模块,所以在某种程度上,这并不重要。