2016-06-16 60 views
2

我有一個偶爾打斷的python 2.7應用程序。在循環中恢復循環的pythonic方法

我正在處理一個非常大的數據文件。爲了處理內存限制,我將數據文件分成了由x和y組件標識的網格。每個網格都是獨立處理的。

這需要很長的時間所以偶爾過程中,我需要在某一點停止處理。理想情況下,我想更新y_start和x_start並在我離開的地方恢復應用程序(不處理已經處理的網格)。

主要動作內發生的嵌套for循環:

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() 

在上面的代碼中,我有x_start處理。 y_start只能用於x_min = x_start時。對於x的所有其他值,它應該從0.0開始。

這是我提出的解決方案。有沒有更好的,更Python的方式:

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(不要重複自己),你可以在使用三元運算的表達,例如:'爲Y_MIN,Y_MAX在y_ranges_resume如果x_min == x_start其他y_ranges:' – AChampion

回答

3

我不知道一個更Python的方式,但是你可以重寫它像這樣(在任何語言真的):

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() 

至少那麼內部循環只寫入一次。

另外,您可以使用上更方便的側三元,但我的錯誤讀,而不是更小的代碼。但出於完整性起見,你可以寫同樣的事情是這樣的:

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] 

或者你可以使用lambda函數簡化條件

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] 

與lambda函數(爲了更好的可讀性)另一種選擇

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

謝謝。這會有所幫助。 –