पाइथन पुनरावृत्ति सीमा जाँच गर्नुहोस् र परिवर्तन गर्नुहोस् (जस्तै sys.setrecursionlimit)

व्यापार

पाइथनमा, पुनरावृत्तिहरूको संख्याको माथिल्लो सीमा हुन्छ (पुनरावर्तीहरूको अधिकतम संख्या)। ठूलो संख्यामा कलहरूको साथ पुनरावर्ती प्रकार्य कार्यान्वयन गर्न, यो सीमा परिवर्तन गर्न आवश्यक छ। मानक पुस्तकालयको sys मोड्युलमा कार्यहरू प्रयोग गर्नुहोस्।

पुनरावृत्तिहरूको संख्या पनि स्ट्याक आकार द्वारा सीमित छ। केही वातावरणहरूमा, मानक पुस्तकालयको स्रोत मोड्युल अधिकतम स्ट्याक साइज परिवर्तन गर्न प्रयोग गर्न सकिन्छ (यसले Ubuntu मा काम गर्यो, तर Windows वा mac मा होइन)।

निम्न जानकारी यहाँ प्रदान गरीएको छ।

  • पुनरावृत्तिको हालको संख्याको माथिल्लो सीमा प्राप्त गर्नुहोस्:sys.getrecursionlimit()
  • पुनरावृत्ति संख्याको माथिल्लो सीमा परिवर्तन गर्नुहोस्:sys.setrecursionlimit()
  • स्ट्याकको अधिकतम आकार परिवर्तन गर्नुहोस्:resource.setrlimit()

नमूना कोड Ubuntu मा चलिरहेको छ।

हालको पुनरावृत्ति सीमा प्राप्त गर्नुहोस्: sys.getrecursionlimit()

हालको पुनरावृत्ति सीमा sys.getrecursionlimit() को साथ प्राप्त गर्न सकिन्छ।

import sys
import resource

print(sys.getrecursionlimit())
# 1000

उदाहरणमा, पुनरावृत्तिहरूको अधिकतम संख्या 1000 हो, जुन तपाइँको वातावरणमा निर्भर हुन सक्छ। ध्यान दिनुहोस् कि हामीले यहाँ आयात गर्ने संसाधन पछि प्रयोग हुनेछ, तर Windows मा होइन।

उदाहरणको रूपमा, हामी निम्न सरल पुनरावर्ती प्रकार्य प्रयोग गर्नेछौं। यदि सकारात्मक पूर्णांक n लाई तर्कको रूपमा निर्दिष्ट गरिएको छ भने, कलहरूको संख्या n पटक हुनेछ।

def recu_test(n):
    if n == 1:
        print('Finish')
        return
    recu_test(n - 1)

यदि तपाईंले माथिल्लो सीमा भन्दा बढी पुनरावृत्ति गर्न प्रयास गर्नुभयो भने त्रुटि (RecursionError) उठ्नेछ।

recu_test(950)
# Finish

# recu_test(1500)
# RecursionError: maximum recursion depth exceeded in comparison

ध्यान दिनुहोस् कि sys.getrecursionlimit() द्वारा प्राप्त मान कडाईका साथ पुनरावृत्तिहरूको अधिकतम संख्या होइन, तर Python अनुवादकको अधिकतम स्ट्याक गहिराइ हो, त्यसैले पुनरावृत्तिहरूको संख्या यो मान भन्दा थोरै कम भए पनि, त्रुटि (RecursionError) हुनेछ। उठाइन्छ।

再帰限界は、再帰の限界ではなく、pythonインタープリタのスタック最大深度।
python – Max recursion is not exactly what sys.getrecursionlimit() claims. How come? – Stack Overflow

# recu_test(995)
# RecursionError: maximum recursion depth exceeded while calling a Python object

पुनरावृत्ति सीमा परिवर्तन गर्नुहोस्: sys.setrecursionlimit()

पुनरावृत्ति संख्याको माथिल्लो सीमा sys.setrecursionlimit() द्वारा परिवर्तन गर्न सकिन्छ। माथिल्लो सीमा तर्कको रूपमा निर्दिष्ट गरिएको छ।

गहिरो पुनरावृत्ति प्रदर्शन गर्न अनुमति दिन्छ।

sys.setrecursionlimit(2000)

print(sys.getrecursionlimit())
# 2000

recu_test(1500)
# Finish

यदि निर्दिष्ट माथिल्लो सीमा धेरै सानो वा धेरै ठूलो छ भने, त्रुटि देखा पर्नेछ। यो बाधा (सीमाको माथिल्लो र तल्लो सीमाहरू) वातावरणमा निर्भर गर्दछ।

सीमाको अधिकतम मान प्लेटफर्ममा निर्भर गर्दछ। यदि तपाइँलाई गहिरो पुनरावृत्ति चाहिन्छ भने, तपाइँ प्लेटफर्म द्वारा समर्थित दायरा भित्र ठूलो मान निर्दिष्ट गर्न सक्नुहुन्छ, तर सचेत रहनुहोस् कि यदि यो धेरै ठूलो छ भने यो मान क्र्यास हुनेछ।
If the new limit is too low at the current recursion depth, a RecursionError exception is raised.
sys.setrecursionlimit() — System-specific parameters and functions — Python 3.10.0 Documentation

sys.setrecursionlimit(4)
print(sys.getrecursionlimit())
# 4

# sys.setrecursionlimit(3)
# RecursionError: cannot set the recursion limit to 3 at the recursion depth 1: the limit is too low

sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000

# sys.setrecursionlimit(10 ** 10)
# OverflowError: signed integer is greater than maximum

पुनरावृत्तिहरूको अधिकतम संख्या पनि स्ट्याक साइजद्वारा सीमित छ, जसरी अर्को व्याख्या गरिएको छ।

स्ट्याकको अधिकतम आकार परिवर्तन गर्नुहोस्: resource.setrlimit()

sys.setrecursionlimit() मा ठूलो मान सेट गरिए पनि, पुनरावृत्तिको संख्या ठूलो भएमा यो कार्यान्वयन नहुन सक्छ। निम्नानुसार विभाजन त्रुटि हुन्छ।

sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000
recu_test(10 ** 4)
# Finish

# recu_test(10 ** 5)
# Segmentation fault

पाइथन मा, मानक पुस्तकालय मा संसाधन मोड्युल अधिकतम स्ट्याक आकार परिवर्तन गर्न प्रयोग गर्न सकिन्छ। यद्यपि, संसाधन मोड्युल युनिक्स-विशिष्ट मोड्युल हो र Windows मा प्रयोग गर्न सकिँदैन।

resource.getrlimit() को साथ, तपाईंले तर्कमा निर्दिष्ट गरिएको स्रोतको सीमा (नरम सीमा, कडा सीमा) को रूपमा प्राप्त गर्न सक्नुहुन्छ। यहाँ, हामीले स्रोतको रूपमा RLIMIT_STACK निर्दिष्ट गर्छौं, जसले हालको प्रक्रियाको कल स्ट्याकको अधिकतम आकारलाई प्रतिनिधित्व गर्दछ।

print(resource.getrlimit(resource.RLIMIT_STACK))
# (8388608, -1)

उदाहरणमा, नरम सीमा 8388608 (8388608 B = 8192 KB = 8 MB) र कडा सीमा -1 (असीमित) हो।

तपाईं resource.setrlimit() को साथ स्रोतको सीमा परिवर्तन गर्न सक्नुहुन्छ। यहाँ, नरम सीमा पनि -1 मा सेट गरिएको छ (कुनै सीमा छैन)। तपाईं असीमित सीमा को प्रतिनिधित्व गर्न को लागी स्थिर संसाधन पनि प्रयोग गर्न सक्नुहुन्छ।RLIM_INFINIT।

गहिरो पुनरावृत्ति, जुन स्ट्याक आकार परिवर्तन अघि विभाजन त्रुटिको कारण प्रदर्शन गर्न सकिँदैन, अब प्रदर्शन गर्न सकिन्छ।

resource.setrlimit(resource.RLIMIT_STACK, (-1, -1))

print(resource.getrlimit(resource.RLIMIT_STACK))
# (-1, -1)

recu_test(10 ** 5)
# Finish

यहाँ, एक साधारण प्रयोगको लागि नरम सीमा -1 (कुनै सीमा छैन) मा सेट गरिएको छ, तर वास्तवमा, यो उपयुक्त मानमा सीमित गर्न सुरक्षित हुनेछ।

थप रूपमा, जब मैले मेरो म्याकमा असीमित नरम सीमा सेट गर्ने प्रयास गरें, निम्न त्रुटि देखा पर्‍यो।ValueError: not allowed to raise maximum limit
sudo सँग स्क्रिप्ट चलाउन मद्दत गरेन। यो प्रणाली द्वारा प्रतिबन्धित हुन सक्छ।

सुपर प्रयोगकर्ताको प्रभावकारी UID भएको प्रक्रियाले कुनै पनि सीमा सहित कुनै पनि उचित सीमा अनुरोध गर्न सक्छ।
यद्यपि, प्रणाली द्वारा लगाइएको सीमा नाघेको अनुरोध अझै पनि ValueError हुनेछ।
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation

विन्डोज एक संसाधन मोड्युल छैन, र म्याक प्रणाली सीमाहरु को कारण अधिकतम स्ट्याक आकार परिवर्तन गर्न सकेन। यदि हामी केहि माध्यम बाट स्ट्याक आकार बढाउन सक्छौं, हामी विभाजन गल्ती को समाधान गर्न को लागी सक्षम हुनुपर्दछ, तर हामी यो पुष्टि गर्न सक्षम छैनौं।

Copied title and URL