2014-07-11 79 views
0

有人建議更換我:For循環效率,當使用枚舉或其他功能

for m in hazardflr: 
    safetiles.append((m, step)) 
    i = 0 

一個更合理的方法,如:

for i, m in enumerate(hazardflr): 
    safetiles.append((m, step)) 

如果有一種方法可以讓這個更有效,

我現在看到這是如何保存代碼行,並說同樣的事情。我不知道enum()函數。我的問題是現在是否有任何其他修改我可以做,使這個代碼更有效率和行保存?

def missingDoor(trapdoor, roomwidth, roomheight, step):   
    safezone = [] 
    hazardflr = givenSteps(roomwidth, step, True) 
    safetiles = [] 

    for i, m in enumerate(hazardflr): 
     safetiles.append((m,step)) 
     while i < len(safetiles): 
      nextSafe = safetiles[i] 
      if knownSafe(roomwidth, roomheight, nextSafe[0], nextSafe[1]): 
       if trapdoor[nextSafe[0]/roomwidth][nextSafe[0]%roomwidth] is "0": 
        if nextSafe[0] not in safezone: 
         safezone.append(nextSafe[0]) 
        for e in givenSteps(roomwidth, nextSafe[0], True): 
         if knownSafe(roomwidth, roomheight, e, nextSafe[0]): 
          if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e,nextSafe[0]) not in safetiles: 
           safetiles.append((e,nextSafe[0])) 
      i += 1 
    return sorted(safezone) 

回答

0

分配nextSafe[0]使用表達nextSafe[0]局部變量

您的代碼是9倍(如果我計數正確地)。

從列表中訪問項目比從變量中選取值要昂貴。

修改如下:

for i,m in enumerate(hazardflr): 
safetiles.append((m,step)) 
    while i < len(safetiles): 
     nextSafe = safetiles[i] 
     ns0 = nextSafe[0] 
     if knownSafe(roomwidth, roomheight, ns0, nextSafe[1]): 
      if trapdoor[ns0/roomwidth][ns0 % roomwidth] is "0": 
       if ns0 not in safezone: 
        safezone.append(ns0) 
       for e in givenSteps(roomwidth,ns0,True): 
        if knownSafe(roomwidth, roomheight, e, ns0): 
         if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e, ns0) not in safetiles: 
          safetiles.append((e, ns0)) 

可能加速它一點。

safezoneset

測試item in list_var正在掃描整個列表爲list_var作爲一個列表。

如果你把測試item in set_var,它知道結果幾乎立即不管set_var變量的大小,因爲set具有某種散列其作品有「數據庫索引」對於查找。

在你的代碼更改safezone = []safezone = set()

其實,你完全可以跳過會員測試你的情況:

if ns0 not in safezone: 
    safezone.append(ns0) 

可以變成:

safezone.add(ns0) 

爲集將照顧只保留獨特的項目。

+0

謝謝你抓到!我想當我迭代代碼時,我沒有考慮將它變成一個變量 – SteveZrg

+0

在哪裏可以將set_var放在代碼中呢?我是否必須說完整的「item in set_ver」? – SteveZrg

+0

@SteveZrg無需引入'set_ver',我編輯了我的答案:您應該將'safezone'初始化更改爲'safezone = set()' –