【问题标题】:getattr() versus dict lookup, which is faster?getattr() 与 dict 查找,哪个更快?
【发布时间】:2012-12-29 18:56:21
【问题描述】:

一个有点幼稚的最佳实践问题。我习惯性地使用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'

【问题讨论】:

  • 为什么不同时尝试一下,看看哪个更快?

标签: python performance getattr dynamic-attributes


【解决方案1】:

您最好使用getattr() 而不是直接转到__dict__ 结构。

不是因为它更快或更慢,而是因为官方 API 在所有情况下都可以工作,包括__dict__的类(使用@987654321时) @ 例如),或者当一个对象实现了__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() 的工作量更大。

【讨论】:

  • getattr 还尊重 MRO 和描述符(常见示例:属性)。
  • 我找不到更好的答案了!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-05-02
  • 2010-10-09
  • 2014-12-04
相关资源
最近更新 更多