2012-03-20 11 views
10

नीचे दिया गया उदाहरण पायथन 2.7 पर एक आरईएसटी डेटाबेस ड्राइवर से है।getattr() स्वयं से धीमा क्यों है .__ dict __।() प्राप्त करें?

नीचे __setattr__ विधि में, अगर मैं बाहर टिप्पणी की getattr() लाइन का उपयोग करें, यह कम कर देता है 230.

करने के लिए 600 आर पी एस से वस्तु इन्स्टेन्शियशन प्रदर्शन क्यों getattr() इतना इस मामले में self.__dict__.get() की तुलना में धीमी है?

class Element(object): 

    def __init__(self, client): 
     self._client = client 
     self._data = {} 
     self._initialized = True 

    def __setattr__(self, key, value): 
     #_initialized = getattr(self, "_initialized", False) 
     _initialized = self.__dict__.get("_initialized", False) 
     if key in self.__dict__ or _initialized is False: 
      # set the attribute normally 
      object.__setattr__(self, key, value) 
     else: 
      # set the attribute as a data property 
      self._data[key] = value 
+1

एक तरफ ध्यान दें, यदि आपके पास ऐसा प्रदर्शन अंतर है, तो स्थानीय चर में कैश 'self .__ dict__' करें - यहां तक ​​कि केवल दो तक पहुंच के लिए। ('__setattr__' की शुरुआत में' dict_ = self .__ dict__') – jsbueno

उत्तर

12

संक्षेप में: क्योंकि getattr(foo,bar)does the same thing as foo.bar है, जो एक ही बात के रूप में सिर्फ __dict__ प्रॉपर्टी एक्सेस नहीं है (एक शुरुआत के लिए, getattr सही __dict__ चयन करने के लिए है, लेकिन वहाँ भी बहुत कुछ शामिल हो रहा है)।

विवरण में शामिल है, या यहां से जुड़ा हुआ है: http://docs.python.org/reference/datamodel.html ("getattr" के लिए खोजें)।

+2

@bereal: आपको चीजों को फिर से पढ़ना होगा। Foo .__ dict __ के लिए आवश्यक संचालन (प्राप्त करें() getattr() के उचित उप-समूह हैं। – bukzor

+2

@bereal भालू ध्यान में रखें कि पायथन बाइटकोड प्राचीन परिचालन के अनुरूप नहीं है। एक बहुत जटिल कार्य को कॉल करने के लिए आपके पास बाइटकोड की बहुत छोटी मात्रा हो सकती है, जबकि एक साधारण अभिव्यक्ति बहुत अधिक बाइटकोड उत्पन्न कर सकती है। इसके अलावा, क्या bukzor कहा सही और प्रासंगिक है। – Marcin

+0

@bereal किसी भी तरह से यह अस्वीकार नहीं करता है कि 'foo .__ dict__' 'getattr (foo,' __dict __ ') जैसा ही है, क्योंकि' getattr (foo,' __ dict __ ') को कॉल करने के लिए यह संभव है और अधिक कुशल होने के लिए एक मनमाना विशेषता को संदर्भित करने से। – Marcin

संबंधित मुद्दे