15

ややお粗末な、ベストプラクティスの質問。object.__dict__[some_key]習慣として使用して、オブジェクトの属性値を動的に検索します。今、私はどちらがより良い/より速いのか疑問に思っています:私の現在の習慣またはgetattr(object,some_key)。1つが優れている場合、なぜですか?

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

1 に答える 1

51

getattr()構造に直接移動するのではなく、使用する方がはるかに優れています__dict__

速いまたは遅いからではなく、公式APIがすべての状況で機能するためです。たとえば、を持たないクラスの場合、オブジェクトがまたはフックを実装する場合、または問題の属性が記述子である場合などです。 (など)、またはクラス属性。__dict____slots____getattr____getattribute__property

あるPythonステートメントまたは手法が別の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()、より多くの作業を行うことがわかります。

于 2012-12-29T18:58:22.303 に答える