2016-06-16 2 views
2

저는 때때로 방해하는 python 2.7 응용 프로그램이 있습니다.루프 내에서 루프를 다시 시작하는 파이썬 방법은 무엇입니까

매우 큰 데이터 파일을 처리하고 있습니다. 메모리 제약 조건을 처리하기 위해 x 및 y 구성 요소로 식별되는 표로 데이터 파일을 나눕니다. 각 그리드는 독립적으로 처리됩니다.

가끔씩 처리하는 데 시간이 오래 걸리기 때문에 특정 시점에서 처리를 중지해야합니다. 이상적으로는 y_start 및 x_start를 업데이트하고 중단 한 위치에서 응용 프로그램을 다시 시작하고 싶습니다 (이미 처리 된 표를 처리하지 않고).

주요 동작 내에 발생위한 루프 중첩 :

x_start=0.0 
x_step=0.05 
x_size=10.0 
y_start=0.0 
y_step=0.05 
y_size=10.0 

x_ranges = zip(np.arange(x_start,x_size,x_step), np.arange(x_step+x_start,x_size+x_step,x_step)) 

y_ranges = zip(np.arange(0.0,y_size,y_step), np.arange(y_step,y_size+y_step,y_step)) 


for x_min,x_max in x_ranges: 
    for y_min,y_max in y_ranges: 

     doAction() 

위 코드에서, I는 x_start 취급있다. y_start는 x_min = x_start 일 때만 사용해야합니다. 다른 모든 x 값은 0.0부터 시작해야합니다.

다음은 내가 제안한 해결책입니다. 더 나은, 더 파이썬 방법이 :

y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step) 

for x_min,x_max in x_ranges: 
    if x_min == x_start:  
     for y_min,y_max in y_ranges_resume: 
      doAction() 
    else: 
     for y_min,y_max in y_ranges: 
      doAction() 
+0

나는 당신이 달성하고 싶은 것을 설명해야한다고 생각한다. 나는 for 루프로 할 수있는 일이 더 많다고 생각한다. :) –

+0

좋은 지적. 세부 사항을 추가하겠습니다. –

+1

DRY (반복하지 말 것)에 대해 for 표현식에서 삼항 연산자를 사용할 수 있습니다 (예 :'for y_min, y_max in y_ranges_resume if x_min == x_start else y_ranges : ' – AChampion

답변

3

내가 더 파이썬 방식에 대해 확실하지 않다,하지만 당신은 (정말 모든 언어에서) 이런 식으로 재 작성 수 :

y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step) 

for x_min,x_max in x_ranges: 
    y_ranges_used = y_ranges 
    if x_min == x_start:  
     y_ranges_used = y_ranges_resume 

    for y_min,y_max in y_ranges_used: 
     doAction() 

이상 내부 루프는 한번만 쓰여진다.

다른 방법으로는 3 진수를 사용할 수 있지만 작은 코드보다는 읽기가 편합니다. 당신은 지능형리스트를 시도 할 수

y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step) 

for x_min,x_max in x_ranges: 
    for y_min, y_max in y_ranges_resume if x_min == x_start else y_ranges: 
     doAction() 
+0

대단히 고마워요! –

2

:하지만 완전성을 위해 당신은 같은 일을 이런 식으로 쓸 수

[[doAction() for y_min,y_max in y_ranges_resume] if x_min == x_start else [doAction() for y_min,y_max in y_ranges] for x_min,xmax in x_ranges] 

을 아니면 조건

correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges 
[[doAction() for y_min,y_max in correct_y_range(x_min)] for x_min,x_max in x_ranges] 
을 단순화하기 위해 람다 함수를 사용할 수 있습니다

람다 함수의 또 다른 옵션 (가독성 향상을 위해)

correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges 
for x_min,x_max in x_ranges: 
    for y_min, y_max in correct_y_range(x_min): 
     doAction() 
+0

그것은 더 pythonic :-). doAction()을 두 번 사용하지 않으려 고 노력하고 있는데 괄호는 코드를 읽기가 더 어렵게 만듭니다. –

+0

나는 Aaron과 비슷한 또 하나를 추가 할 것이다 –

+0

고마워. 도움이 될 것입니다. –

관련 문제