getattr() против поиска dict, что быстрее?

Несколько нубистский, вопрос лучшей практики. Я динамически ищу значения атрибутов объекта, используя object.__dict__[some_key] по привычке. Теперь мне интересно, что лучше / быстрее: моя нынешняя привычка или getattr(object,some_key), Если кто-то лучше, почему?

>>> class SomeObject:
...     pass
... 
>>> so = SomeObject()
>>> so.name = 'an_object'
>>> getattr(so,'name')
'an_object'
>>> so.__dict__['name']
'an_object'

1 ответ

Решение

Вы гораздо лучше использовать getattr() вместо того, чтобы идти прямо к __dict__ состав.

Не потому что это быстрее или медленнее, а потому что официальный API работает при любых обстоятельствах, в том числе для классов, которые не имеют __dict__ (когда используешь __slots__ например), или когда объект реализует __getattr__ или же __getattribute__ перехватывает или когда рассматриваемый атрибут является дескриптором (например, property) или атрибут класса.

Если вы хотите узнать, быстрее ли какой-либо один оператор или метод Python, чем другой, используйте timeit Модуль для измерения разницы:

>>> import timeit
>>> class Foo(object):
...     pass
... 
>>> foo = Foo()
>>> foo.bar = 'spam'
>>> timeit.timeit("getattr(foo, 'bar')", 'from __main__ import foo')
0.2125859260559082
>>> timeit.timeit("foo.__dict__['bar']", 'from __main__ import foo')
0.1328279972076416

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

Другие вопросы по тегам