2010-06-30 9 views
6

En python, sé que buscar una variable de ámbito local es mucho más rápido que buscar una variable de ámbito global. Por lo tanto:Python: ¿los atributos de clase son equivalentes a las variables locales cuando están dentro de un método?

a = 4 
def function() 
    for x in range(10000): 
     <do something with 'a'> 

es más lento que

def function() 
    a = 4 
    for x in range(10000): 
     <do something with 'a'> 

Así, cuando miro a una definición de clase, con un atributo y un método:

class Classy(object): 
    def __init__(self, attribute1): 
     self.attribute1 = attribute1 
     self.attribute2 = 4 
    def method(self): 
     for x in range(10000): 
      <do something with self.attribute1 and self.attribute2> 

¿Es mi uso de self.atributo más como mi primera o segunda función? ¿Qué pasa si clasifico Classy e intento acceder al atributo 2 desde un método en mi subclase?

Respuesta

4

Las variables de ámbito local son rápidas porque el intérprete no necesita hacer una búsqueda de diccionario. Sabe en tiempo de compilación exactamente cuántas variables locales habrá y crea instrucciones para acceder a ellas como una matriz.

Los atributos de miembro requieren una búsqueda de diccionario, por lo que se ejecutan de manera similar al primer ejemplo utilizando variables de ámbito global.

Para la velocidad, se puede hacer algo como:

attribute1 = self.attribute1 
# do stuff with attribute1 

cuales sombras atributo1 en una variable local, por lo que sólo se necesita un diccionario de búsqueda única. No me molestaría a menos que hubiera hecho algunos perfiles indicando que un método era un cuello de botella, sin embargo.

+0

Si bien tenía curiosidad acerca de la respuesta a esta pregunta en general, la verdadera razón por la que la preguntaba era porque tenía una serie de constantes que casi con certeza usaría solo un método, y no estaba seguro de si debería hacerlo. defínalos dentro de ese método, o dentro de init (en caso de que luego me dé cuenta de que necesitan ser accedidos a otra parte). Como esa posibilidad es remota, creo que los definiré en el método. Gracias. – Wilduck

Cuestiones relacionadas