python - getattr() 与 __dict__ 查找,哪个更快?

标签 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'

最佳答案

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

不是因为它更快或更慢,而是因为官方 API 适用于所有 情况,包括那些__dict__ 的类(例如,当使用 __slots__ 时),或者当一个对象实现了 __getattr__ 时或 __getattribute__钩子(Hook),或者当有问题的属性是 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() 做了更多的工作。

关于python - getattr() 与 __dict__ 查找,哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14084897/

相关文章:

python - 使用python pymsql在mysql查询中出错

python - 如何在excepts子句中使用程序包中的自定义异常?

python - 从 while 循环返回而不退出它 python

python - __getattr__ 在模块上

python - 使用 getattr 获取方法的对象引用

python - python copy.deepcopy时的递归错误

python - 在 Netbeans 中设置 Python

php - 在 PHP 中,每页多少次 DB 调用是可以的?

c# - Hangfire 作业插入对应用程序 API 性能的影响

performance - 多列的matlab矩阵索引