getattr() versus dict lookup, which is faster?

时光怂恿深爱的人放手 提交于 2019-11-28 03:21:11

问题


A somewhat noobish, best practice question. I dynamically look up object attribute values using object.__dict__[some_key] as a matter of habit. Now I am wondering which is better/faster: my current habit or getattr(object,some_key). If one is better, why?

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

回答1:


You are much better off using getattr() instead of going directly to the __dict__ structure.

Not because it's faster or slower, but because the official API works in all circumstances, including for classes that do not have a __dict__ (when using __slots__ for example), or when an object implements the __getattr__ or __getattribute__ hooks, or when the attribute in question is a descriptor (such as a property), or a class attribute.

If you want to know if any one python statement or technique is faster than another, use the timeit module to measure the difference:

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

You can see that directly accessing __dict__ is faster, but getattr() does a lot more work.



来源:https://stackoverflow.com/questions/14084897/getattr-versus-dict-lookup-which-is-faster

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!