2017-02-28 61 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