getattr()和__dict__查找,哪个更快?

18

我可以使用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个回答

52

使用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()会做更多的工作。


11
getattr 函数也会遵循方法解析顺序(MRO)和描述符(常见例子是属性)。 - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接