2014-07-11 46 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()' –