Python: Атрибуты класса эквивалентны локальным переменным внутри метода? - PullRequest
6 голосов
/ 30 июня 2010

В Python я знаю, что поиск локальной переменной области значительно быстрее, чем поиск глобальной переменной области. Итак:

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

Медленнее, чем

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

Итак, когда я смотрю на определение класса с атрибутом и методом:

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>

Мое использование self.attribute больше похоже на мою первую или вторую функцию? Что если я подкласс Classy и попытаюсь получить доступ к attribute2 из метода в моем подклассе?

1 Ответ

4 голосов
/ 30 июня 2010

Переменные в локальной области работают быстро, потому что интерпретатору не нужно выполнять поиск по словарю. Во время компиляции он точно знает, сколько будет локальных переменных, и создает инструкции для доступа к ним в виде массива.

Атрибуты-члены требуют поиска в словаре, поэтому они выполняются аналогично первому примеру с использованием глобально изменяемых переменных.

Для скорости вы можете сделать что-то вроде:

attribute1 = self.attribute1
# do stuff with attribute1

который затеняет attribute1 в локальной переменной, поэтому требуется только один поиск по словарю. Я бы не стал беспокоиться, если бы не сделал какое-то профилирование, указывающее на то, что метод был узким местом.

...