2010-08-23 13 views
17

मैं अपने पिलों ऐप के लिए एक समय सजावट के साथ खेल रहा हूं ताकि विशिष्ट कार्यों के लिए फ्लाई टाइमिंग जानकारी प्रदान की जा सके। मैंने इसे एक सजावटी & बनाकर किया है जो इसे नियंत्रक में किसी भी फ़ंक्शन से जोड़ता है जिसे मैं समय चाहता हूं।कितने ओवरहेड सजावटी पाइथन फ़ंक्शन कॉल करते हैं

यह बताया गया है कि सजावटी कॉल करने के लिए उचित मात्रा में ओवरहेड जोड़ सकते हैं, और वे एक अवांछित कार्य से 2-3x धीमी गति से चलते हैं।

सबसे पहले, मुझे लगता है कि एक सजाया फ़ंक्शन को निष्पादित करने के लिए एक एक असज्जित एक से अधिक समय हराना ले जाएगा उम्मीद करेंगे, लेकिन मुझे लगता है कि भूमि के ऊपर सेकंड के हजारवें हिस्से में होने के लिए एक एसक्यूएल डालने कॉल की तुलना में नगण्य हो & उम्मीद करेंगे। सजावटी स्वयं समय-समय() & का उपयोग करके सरल सरल समय गणना करता है कुछ बहुत ही सरल एकत्रीकरण।

क्या सजावटी सिस्टम में महत्वपूर्ण ओवरहेड जोड़ते हैं? मुझे इसे वापस करने के लिए कुछ भी नहीं मिला।

+5

सजावट का ऊपरी भाग मापने योग्य है, लेकिन कहीं भी 2-3x के करीब नहीं है। यह सजावट व्यवहार को ध्यान में रखता नहीं है, जो आप कर रहे हैं (डेटाबेस अपडेट, चंद्रमा से संकेतों को उछालते हुए) के आधार पर बहुत समय लेने वाला हो सकता है। चंद्रमा से संकेतों को उछालने के लिए – PaulMcG

+1

+1 –

+0

इसी प्रकार, लेकिन भविष्य की टिप्पणी के लिए +2 को आरक्षित करना: "सिंक्रोनस चाँद-सिग्नल-बाउंसिंग" – Profane

उत्तर

13

सजावटी का उपयोग करके जोड़ा गया ओवरहेड केवल एक अतिरिक्त फ़ंक्शन कॉल होना चाहिए।

सजावटी द्वारा किया जा रहा काम ओवरहेड का हिस्सा नहीं है क्योंकि आपका विकल्प सजाए गए ऑब्जेक्ट के बराबर कोड जोड़ना है।

तो यह संभव है कि सजाने के कार्य को चलाने में दो गुना लंबा लगे, लेकिन ऐसा इसलिए है क्योंकि सजावटी कुछ महत्वपूर्ण काम कर रहा है जो अनावश्यक कार्य के रूप में लगभग एक ही समय में मजा आता है।

+5

टाइपो के लिए उपरोक्त। – Dolph

5

क्या जानना महत्वपूर्ण है एक डेकोरेटर एक सरल प्रभाव पड़ता है:

@decorator 
def f(): 
    … 

बस वाक्यात्मक चीनी है

def f(): 
    … 
f = decorator(f) 

इस प्रकार के लिए, डेकोरेटर कुछ नहीं करता है, तो आप की जरूरत नहीं है कॉलिंग सजाए गए फ़ंक्शन (कॉल decorator(f) में थोड़ा समय लगता है), जैसे

decorator = lambda func: func 
@decorator 
def f(): 
    … 

यदि सजावटी कुछ भी करता है, तो आप सजावटी के भीतर जो कुछ भी ओवरहेड प्राप्त करते हैं, उसे प्राप्त करते हैं। यह आमतौर पर एक अतिरिक्त समारोह कॉल (सजाया समारोह की कि),

def decorator(func): 
    def decorated_func(): 
     print "Before calling function", func # Some overhead (but that's normal) 
     func() # This will be a second function call, after the call to decorated_func() 
    return decorated_func 

इस प्रकार के रूप में शामिल हैं, अपने आप में, सजा एक समारोह में ज्यादा भूमि के ऊपर है कि आप क्या करना चाहते हैं के लिए नहीं जोड़ता है: केवल स्पष्ट भूमि के ऊपर है कि आप सैद्धांतिक निकाय में func() को सजाए गए फ़ंक्शन में कॉल नहीं करना होगा, बल्कि इसके पूर्ण कोड की प्रतिलिपि बनाना होगा, लेकिन कोड की सुगमता भुगतनी होगी (सुगमता और लचीलापन कुछ कारण हैं जो सजावटी पहले स्थान पर मौजूद हैं)।

+0

-1 पायथन में फ़ंक्शन कॉल ओवरहेड महत्वहीन नहीं है। और यह सुझाव देने के लिए कि सजावट में 'func()' का कोड दोहराएं, सजावटकर्ता के पूरे बिंदु को पहले स्थान पर हरा देता है। यदि कुछ भी हो, तो मैं सजावटी के कोड को 'func()' में दोहराना पसंद करूंगा, लेकिन फिर, अगर हम ऐसा करते हैं, तो सजावटी का उपयोग करने की सादगी पराजित हो जाती है और सजावट के व्यवहार के साथ 'func() 'कोड को प्रदूषित किया जाता है । आप वास्तव में यह नहीं कह सकते कि "अगर सजावटी कुछ नहीं करता है, तो आपके पास कोई ओवरहेड नहीं है"। सजावटी कोड ट्रेसिंग आदि के लिए उपयोगी हैं, लेकिन वे रनटाइम पर एक अतिरिक्त फ़ंक्शन कॉल की लागत पर आते हैं। – PaulMcG

+0

@ पॉल: दरअसल, फ़िथन कॉल ओवरहेड पायथन में अपेक्षाकृत महत्वपूर्ण है (अन्यथा कभी नहीं कहा गया!)। और मैं इस तथ्य से सहमत हूं कि सजावट में 'func() 'कोड डालने से सजाए गए पूरे बिंदु को हराया जाता है (जैसा कि मैंने लिखा था)। इसलिए हम पूरी तरह से सहमत हैं! मैं केवल प्रमुख बिंदु दे रहा था जो मूल पोस्टर को समझने दें कि एक सजावट का ऊपरी भाग कहां से आता है। – EOL

+0

मेरा मुख्य क्विबल आपकी स्टेटमेंट के साथ था "यदि सजावटी कुछ भी नहीं करता है, तो आपके पास कोई ओवरहेड नहीं है," जो आपको लगता है कि आप अतिरिक्त फ़ंक्शन कॉल को देख रहे थे। मैं अपने डाउनवोट को हटाने के लिए गया, लेकिन SO मुझे तब तक नहीं जाने देगा जब तक आप अपने उत्तर में कुछ संपादन नहीं करते। – PaulMcG

4

क्या सजावटी सिस्टम में महत्वपूर्ण ओवरहेड जोड़ते हैं? मुझे इसे वापस करने के लिए कुछ भी नहीं मिला।

वे लगभग कोई मापनीय ओवरहेड जोड़ते हैं। शून्य।

यह ध्यान रखना महत्वपूर्ण है कि सजावटी सजावटी समारोह बनाने के लिए एक बार चलता है। एक बार।

सजाए गए फ़ंक्शन में इसके दो भाग हैं।

  1. जो भी सजावट जोड़ा गया था। यह ऊपरी नहीं है।

  2. प्लस मूल फ़ंक्शन। यह ऊपरी नहीं है।

कोई वास्तविक ओवरहेड नहीं है। आप - कुछ देखभाल के साथ - सजाए गए फ़ंक्शन के हिस्से के रूप में एक अतिरिक्त फ़ंक्शन कॉल-एंड-रिटर्न के ओवरहेड को मापने में सक्षम हो सकते हैं, लेकिन यह लगभग अनजाने में छोटा है। और यह शायद एक वैकल्पिक डिजाइन से बहुत कम है जो सजावट का उपयोग नहीं करता है।

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