2017-02-28 7 views
1

파이썬 코드에 문제가 있습니다.하지만 다른 언어로 이미 접했던 문제입니다. 일반적인 대답을 원합니다.루프에서 조건문 최적화/중복 된 코드 제거하는 방법

많은 문을 포함하는 루프가 있다고 가정 해 보겠습니다. 이러한 명령문 중 하나는 반복을 통해 변경되지 않는 조건에 따라 달라집니다.

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 

을, 문제는 우리가 필요하지 않습니다 각 반복에서 뭔가를 테스트하는 것입니다. 두 번째 솔루션은 조건을 한 번 테스트 한 다음 이에 따라 루프를 시작하기 때문에 속도가 향상됩니다. 하지만 지금은 많은 코드 복제가 있습니다 (많은 문장이 매회 다시 작성됩니다 ...).

두 번째 코드만큼 효율적일 것이라고 생각하지 못한 세 번째 방법이 있습니까? 코드 중복이 없습니까? 감사!

편집 :

내가 C++ 컴파일러는 이미 (컴파일하는 동안 두 번째로 첫 번째 버전을 변환하여) 최적화를 수행하는 것이 비슷한 주제 (Optimizing a Loop vs Code Duplication)를 참조하십시오. 파이썬과 같은 해석 언어는 어떻습니까?

+0

이 조건이 상당히 부담이 있습니까 감소, 지금

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) 

:

위 내 코드에서 '다른'에서이 작업을 수행 시험 할까? 그렇다면 루프 내에서 루프를 반복적으로 테스트하지 않아도되도록 변수에 결과를 할당 할 수 있습니다. – khelwood

+0

루프 전에 'conditionA' 및'conditionB'의 값을 계산할 수 없습니까? –

+0

당신의 조건이 O (1)가 아니라면, * 시간 복잡성 *은 루프가 조건 안에 있는지 또는 그 반대인지에 관계없이 동일합니다. 당신은 단지 "속도"에 대해 그것을 오용하고있을 가능성이 큽니다. – spectras

답변

0

아래 코드는 루프 요소에 '의존하는'조건과 루프 요소에 '독립적'조건을 구분합니다.

문 대신 람다를 사용하는 루프 함수를 만듭니다. 유일한 중복 여기에 내가 심지어이 두 번 중복을 최소화하고 싶었지만 조건부 람다와 물건을 필요할 것 같은 그 다소 복잡한 얻을 것

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 
     . 
     . 
     . 

추측 람다 일부가 될 수 있습니다.

편집 : 심지어 이중 중복 - D

+0

재미 있습니다! 제 경우에는 조건 X와 Y가있는 마지막 부분조차 필요하지 않습니다. 답변 해주셔서 감사합니다 :) – Telergoel