2014-07-11 4 views
0

Quelqu'un a suggéré de remplacer mon:Pour plus d'efficacité en boucle lors de l'utilisation d'énumérer ou d'autres fonctions

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

avec une approche plus raisonnable, comme:

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

s'il y a un moyen de rendre plus efficace,

Je vois maintenant comment cela sauve les lignes de code et dit la même chose. Je ne savais pas à propos de la fonction enum(). Ma question est la suivante: y a-t-il d'autres modifications que je peux faire pour rendre ce code plus efficace et plus efficace?

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) 

Répondre

0

assign nextSafe[0] à une variable locale

Votre code est 9 fois (si je compte correctement) en utilisant l'expression nextSafe[0].

L'accès à un élément à partir d'une liste est plus coûteux que de choisir la valeur d'une variable.

Modification comme suit:

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

pourrait accélérer un peu.

tour safezone dans set

un test item in list_var numérise liste complète pour list_var étant une liste.

Si vous activez le test item in set_var, il sait le résultat presque immédiatement quelle que soit la taille de la variable set_var, parce que set a sorte de hachage qui fonctionne comme « index de base de données » pour la recherche.

Dans votre changement de code safezone = [] dans safezone = set()

En fait, vous pouvez complètement ignorer le test d'adhésion dans votre cas:

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

peut être transformé en:

safezone.add(ns0) 

comme jeu prendra soin de ne garder que des objets uniques.

+0

merci d'avoir attrapé ça !!! Je suppose que quand je itérais le code, je n'ai pas pris en faisant une variable dans le compte – SteveZrg

+0

où est-ce que je mettrais le set_var dans le code alors? dois-je dire "item dans set_ver" ??? – SteveZrg

+0

@SteveZrg pas besoin d'introduire 'set_ver', j'ai édité ma réponse: vous devez changer l'initialisation' safezone' à 'safezone = set()' –

Questions connexes