2012-12-29 6 views
7

다소 노버시, 모범 사례 질문입니다. 나는 동적으로 object.__dict__[some_key]을 사용하여 객체 속성 값을 동적으로 찾는다. 이제 어느 것이 더 좋고/더 빠른지 궁금합니다. 현재의 습관 또는 getattr(object,some_key). 하나가 더 좋다면, 왜?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__ 후크 또는 문제의 속성이 descriptor (예 : property)이거나 클래스 속성 인 경우

>>> 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() 수 있습니다

당신이 어떤 하나의 파이썬 문 또는 기술이 다른 것보다 더 빠른 경우 알고 싶은 경우는 timeit module 측정 에 차이를 사용 더 많은 일을합니다.

+1

+1에'__slots__ '을 언급하고 측정을 제안했습니다. –

+7

'getattr'은 또한 MRO와 기술자 (일반적인 예 : 속성)를 존중합니다. – delnan

+0

나는 더 나은 대답을 요구할 수 없었다! 감사 – Cole