2012-12-29 10 views
7

多少ノービッシュ、ベストプラクティスの質問です。私は動的にオブジェクトの属性値を参照してくださいobject.__dict__[some_key]を習慣の問題として。今私は、より良い/より速いと思っています:私の現在の習慣またはgetattr(object,some_key)。 1つが良い場合は、なぜですか?getattr()とdictルックアップはどちらが速いですか?

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

両方を試してみて、どちらが速いのを見てみませんか? –

答えて

35

あなたはgetattr()を使用して代わりの__dict__構造に直接行くオフはるかに優れています。

ない、それが速いか遅いですが、公式のAPIがないを行うクラスを含め、すべての状況で動作するため、持っているので、__dict__(例えば__slots__を使用した場合)、またはオブジェクトが実装したときに__getattr____getattribute__フック、または問題の属性がdescriptorpropertyなど)かクラス属性の場合に発生します。

あなたがいずれかの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()見ることができますはるかに多くの作業を行います。

+1

+1は '__slots__ 'に言及し、測定を示唆しています。 –

+7

'getattr'はMROと記述子(一般的な例:プロパティ)も尊重します。 – delnan

+0

私はより良い答えを求めることができませんでした!ありがとう – Cole

関連する問題