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()
делает намного больше работы.