Getattr () versus dict lookup, ¿cuál es más rápido?

Una pregunta un tanto noobisca, mejor práctica. Busco dinámicamente los valores de los atributos del objeto usando el object.__dict__[some_key] como una cuestión de hábito. Ahora me pregunto cuál es mejor / más rápido: mi hábito actual o getattr(object,some_key) . Si uno es mejor, ¿por qué?

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

Es mucho mejor usar getattr() lugar de ir directamente a la estructura __dict__ .

No porque sea más rápido o más lento, sino porque la API oficial funciona en todas las circunstancias, incluso para las clases que no tienen un __dict__ (cuando se usa __slots__ ), o cuando un objeto implementa los __getattr__ o __getattribute__ ganchos, o cuando el atributo en La pregunta es un descriptor (como una property ) o un atributo de clase.

Si desea saber si una instrucción o técnica de Python es más rápida que otra, use el módulo timeit para medir la diferencia:

 >>> 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 

Puede ver que acceder directamente a __dict__ es más rápido, pero getattr() hace mucho más trabajo.