2012-12-29 33 views
7

Câu hỏi thực hành tốt nhất, hơi ngớ ngẩn. Tôi tự động tra cứu các giá trị thuộc tính đối tượng bằng cách sử dụng object.__dict__[some_key] như là một vấn đề của thói quen. Bây giờ tôi tự hỏi cái nào là tốt hơn/nhanh hơn: thói quen hiện tại của tôi hoặc getattr(object,some_key). Nếu một là tốt hơn, tại sao?getattr() so với tra cứu dict, nhanh hơn?

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

Tại sao không thử cả hai và xem cái nào nhanh hơn? –

Trả lời

35

Bạn nên sử dụng getattr() thay vì chuyển trực tiếp đến cấu trúc __dict__.

Không phải vì nó nhanh hơn hoặc chậm hơn, nhưng vì API chính thức làm việc tại tất cả hoàn cảnh, kể cả cho các lớp học mà làm không có một __dict__ (khi sử dụng __slots__ chẳng hạn), hoặc khi một đối tượng thực hiện các __getattr__ hoặc __getattribute__ móc hoặc khi thuộc tính được đề cập là descriptor (chẳng hạn như property) hoặc thuộc tính lớp học.

Nếu bạn muốn biết nếu bất kỳ tuyên bố một python hoặc kỹ thuật nhanh hơn khác, sử dụng timeit module-biện pháp sự khác biệt:

>>> 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 

Bạn có thể thấy rằng truy cập trực tiếp __dict__ là nhanh hơn, nhưng getattr() làm nhiều việc hơn.

+1

+1 để đề cập đến '__slots__' và đề xuất đo lường. –

+7

'getattr' cũng tôn trọng MRO và mô tả (ví dụ chung: thuộc tính). – delnan

+0

Tôi không thể yêu cầu câu trả lời tốt hơn! Cảm ơn – Cole

Các vấn đề liên quan