Почему getattr () намного медленнее, чем self .__ dict __. Get ()? - PullRequest
10 голосов
/ 20 марта 2012

Пример ниже взят из драйвера базы данных REST на Python 2.7.

В методе __setattr__, приведенном ниже, если я использую закомментированную строку getattr(), это снижает производительность создания объекта с 600 об / с до 230.

Почему getattr() намного медленнее, чем self.__dict__.get() в этом случае?

class Element(object):

    def __init__(self, client):
        self._client = client
        self._data = {}
        self._initialized = True

    def __setattr__(self, key, value):
        #_initialized = getattr(self, "_initialized", False)
        _initialized = self.__dict__.get("_initialized", False)
        if key in self.__dict__ or _initialized is False:
            # set the attribute normally
            object.__setattr__(self, key, value)
        else:
            # set the attribute as a data property
            self._data[key] = value

1 Ответ

12 голосов
/ 20 марта 2012

Вкратце: потому что getattr(foo,bar) делает то же самое, что и foo.bar, что не то же самое, что простой доступ к свойству __dict__ (для начала, getattr должен выбрать право __dict__, но происходит гораздо больше).

Подробности, содержащиеся или связанные здесь: http://docs.python.org/reference/datamodel.html (поиск по "getattr").

...