2017-02-28 29 views
1

我遇到了一个与我的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如何?

+0

是你的条件显著繁重去测试?如果是这样,你可以将它们的结果赋值给变量,以避免在循环中反复测试它们。 – khelwood

+0

你不能在循环之前计算'conditionA'和'conditionB'的值吗? –

+0

除非您的条件不是O(1),否则时间复杂度*是相同的,无论循环是在条件内还是在其他方式内。很可能你只是为了“速度”而滥用它。 – spectras

回答

0

我的代码在下面做了什么分离'依赖'的循环元素和独立于循环元素的条件。

建立一个循环函数,它将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 
     . 
     . 
     . 

我想甚至尽量减少这种重复双重但是你需要有条件的lambda表达式和的东西,会得到相当复杂。

编辑

上面我的代码做到这一点在“其他”:

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

+0

这很有趣!在我的情况下,我甚至不需要条件X和Y的最后部分。感谢你的回答 :) – Telergoel