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

时间:2012-12-29 18:56:21

标签: python performance getattr dynamic-attributes

一个有点愚蠢的最佳实践问题。作为习惯,我使用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 个答案:

答案 0 :(得分:42)

使用getattr()而不是直接使用__dict__结构会更好。

不是因为它更快或更慢,而是因为官方API在所有环境中工作,包括的类具有__dict__(使用时)例如__slots__,或者当一个对象实现__getattr____getattribute__个钩子,或者当有问题的属性是descriptor时(例如property} ),或类属性。

如果您想知道任何一个python语句或技术是否比另一个更快,请使用timeit module 衡量差异:

>>> 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()可以做得更多。