अजगर में अपवाद संचालकों की लागत


97

में एक और सवाल , स्वीकार किए जाते हैं जवाब अगर बयान / ब्लॉक को छोड़कर प्रदर्शन में सुधार करने एक कोशिश के साथ अजगर कोड में जगह एक (बहुत सस्ता) का सुझाव दिया।

कोडिंग शैली एक तरफ जारी रखती है, और यह मानते हुए कि अपवाद को कभी ट्रिगर नहीं किया जाता है, अपवाद हैंडलर होने के लिए एक अपवाद नहीं है, बनाम एक-से-शून्य होने की तुलना में (प्रदर्शन-वार) कितना अंतर पड़ता है?


6
जब आपने इसे मापा, तो आपने क्या सीखा?
एस.लॉट

1
संबंधित प्रश्न: stackoverflow.com/questions/1835756
tzot

प्रयास करें / सिवाय इसके कि अगर भाग को नियंत्रित करने की संभावना कम है और यदि संभावनाएं अधिक हैं तो
शैडो ०३५

जवाबों:


113

आप timeitमॉड्यूल का उपयोग करके इसे क्यों नहीं मापते हैं ? इस तरह आप देख सकते हैं कि क्या यह आपके आवेदन के लिए प्रासंगिक है।

ठीक है, इसलिए मैंने निम्नलिखित कोशिश की है:

import timeit

statements=["""\
try:
    b = 10/a
except ZeroDivisionError:
    pass""",
"""\
if a:
    b = 10/a""",
"b = 10/a"]

for a in (1,0):
    for s in statements:
        t = timeit.Timer(stmt=s, setup='a={}'.format(a))
        print("a = {}\n{}".format(a,s))
        print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))

परिणाम:

a = 1
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.25 usec/pass

a = 1
if a:
    b = 10/a
0.29 usec/pass

a = 1
b = 10/a
0.22 usec/pass

a = 0
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.57 usec/pass

a = 0
if a:
    b = 10/a
0.04 usec/pass

a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero

इसलिए, जैसा कि अपेक्षित था, किसी भी अपवाद हैंडलर का न होना थोड़ा तेज है (लेकिन अपवाद होने पर आपके चेहरे पर चोट लग जाती है), और जब तक यह शर्त पूरी नहीं होती है तब तक try/exceptएक स्पष्ट की तुलना में तेज होता है if

लेकिन यह परिमाण के एक ही क्रम के भीतर है और किसी भी तरह से बात करने की संभावना नहीं है। केवल अगर हालत वास्तव में मिले हैं, तो ifसंस्करण काफी तेज है।


3
दिलचस्प। तो इससे try/exceptभी तेज हैif a != 0
थिलो

10
आह, शब्दों का एक अच्छा विकल्प: "यह सभी परिमाण के एक ही क्रम के भीतर है" ... मुझे बहुत से लोगों पर संदेह है जो अपवादों से बचते हैं इसलिए उम्मीद करते हैं कि वे 10x के रूप में धीमी गति से होंगे।
गैरेट ब्लौमा

मेरे कोडोरा पर पायथन 2.7.5 के साथ अपना कोड चलाने से पता चलता है कि "=" संस्करण (0.08 usec / पास) "a / 0.11 usec / पास" को "a / 1" के बजाय "1" से अधिक तेज़ है।
दुलेशी

@duleshi दिलचस्प। मुझे आश्चर्य है कि अगर यह एक x86 / x64 बात है? या शायद अलग प्रोसेसर एक्सटेंशन?
बेसिक

58

यह प्रश्न वास्तव में डिज़ाइन और इतिहास में पूछे जाने वाले प्रश्न है :

यदि कोई अपवाद नहीं उठाया जाता है, तो ब्लॉक को छोड़कर एक प्रयास / अत्यधिक कुशल है। वास्तव में एक अपवाद को पकड़ना महंगा है।


3
मैं बस सोच रहा था कि "बेहद कुशल" कितना कुशल है। जाहिरा तौर पर यह तेज़ है तो एक बहुत ही सरल "अगर" कथन भी।
थिलो

आपके द्वारा पोस्ट किया गया अंश डिज़ाइन और इतिहास FAQ से है
निटास


19

यह सवाल भ्रामक है। यदि आप मानते हैं कि अपवाद को कभी ट्रिगर नहीं किया गया है, तो कोई भी इष्टतम कोड नहीं है।

यदि आप मानते हैं कि अपवाद को त्रुटि स्थिति के भाग के रूप में ट्रिगर किया गया है, तो आप पहले से ही इष्टतम कोड के दायरे से बाहर हैं (और आप शायद वैसे भी ठीक-ठाक स्तर पर इसे संभाल नहीं रहे हैं)।

यदि आप मानक नियंत्रण प्रवाह के भाग के रूप में अपवाद का उपयोग कर रहे हैं - जो कि पाइथोनिक है "माफी मांगें, अनुमति नहीं" रास्ता - तो अपवाद ट्रिगर होने जा रहा है, और लागत अपवाद के प्रकार पर निर्भर करती है, अगर की तरह , और आप कितने प्रतिशत समय के अपवाद का अनुमान लगाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.