优化循环中的条件语句/如何摆脱重复的代码

时间:2017-02-28 09:33:39

标签: python loops optimization conditional-statements code-duplication

我的Python代码存在问题,但这是我在其他语言中遇到过的问题,我想得到一般答案。

假设我有一个包含许多语句的循环。其中一个语句取决于迭代不会改变的条件。我认为有两种方法可以实现这一点:

for ... : 
    ... #many statements
    if conditionA :
        statementA
    elif conditionB : 
        statementB
    else 
        statementC

或:

if conditionA :
    for ... : 
        ... #many statements
        statementA
elif conditionB : 
    for ... : 
        ... #many statements
        statementB
else :
    for ... :
        ... #many statements
        statementC

在第一个解决方案中,问题是我们在每次迭代时测试一些东西,这是不必要的。第二种解决方案具有更好的速度,因为它只测试一次条件然后相应地启动循环,这就是我想要做的;但是现在有很多代码重复(每次重写很多语句......)。

有没有第三种方法我没有想到它会像第二种方式那样有效但没有代码重复?谢谢!

编辑:

我读了一个类似的主题(Optimizing a Loop vs Code Duplication),C ++编译器已经进行了优化(通过在编译期间将第一个版本转换为第二个版本)。那些像Python这样的解释语言呢?

1 个答案:

答案 0 :(得分:0)

下面我的代码所做的是分离“依赖”循环元素的条件和那些与循环元素“独立”的条件。

创建一个循环函数,将lambda替换为语句。这里唯一的重复可能是lambda部分我猜

def loop(arr,func):
     for a in arr
        // many statements

        func(a)
        //statement for that particular condition using lambda


if condition A: ## assume condition doesn't depend on loop elements
    loop(arr,lambda x:##any action)

elif condition B:
    loop(arr,lambda x:##any action)
.
.
.

else:
    for el in arr:
        //many statements

        if condition X: ## This condition depends on the loop element!..
            //statement X
        elif condition Y:
            //statement Y 
        .
        .
        .

我甚至希望尽量减少这种双重复制,但这会变得相当复杂,因为你需要有条件的lambdas和东西。

修改

在我上面的代码中的'else'中执行此操作:

else:
    def func2(a):
        if condition A:
            // some statement depending on the element. 'a' in this case
        elif condition B:
            // some statement depending on the element

    loop(arr,func2)

现在,即使双重复制也减少了:-D