getattr()与dict查找,哪个更快?

Col*_*ole 10 python performance dynamic-attributes getattr

一个有点无趣,最佳实践的问题.我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'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 42

你最好使用getattr()而不是直接进入__dict__结构.

不是因为它的速度更快或更慢,但由于官方的API工作在所有情况下,包括那些类没有一个具有__dict__(在使用__slots__例如),或者当一个对象实现__getattr____getattribute__钩,或当有问题的属性是一个描述符(例如a 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
Run Code Online (Sandbox Code Playgroud)

您可以看到直接访问__dict__速度更快,但可以getattr()完成更多工作.

  • `getattr`也尊重MRO和描述符(常见的例子:属性). (11认同)
  • +1提及`__slots__`并建议测量. (4认同)