ازگر کی تکرار کی حد کو چیک اور تبدیل کریں (جیسے sys.setrecursionlimit)

کاروبار

ازگر میں ، تکرار کی تعداد (تکرار کی زیادہ سے زیادہ تعداد) کی ایک بالائی حد ہے۔ بڑی تعداد میں کالوں کے ساتھ ایک بار بار چلنے والے فنکشن کو انجام دینے کے لیے ، حد کو تبدیل کرنا ضروری ہے۔ معیاری لائبریری کے sys ماڈیول میں افعال استعمال کریں۔

تکرار کی تعداد بھی اسٹیک کے سائز سے محدود ہے۔ کچھ ماحول میں ، معیاری لائبریری کے ریسورس ماڈیول کو زیادہ سے زیادہ اسٹیک سائز تبدیل کرنے کے لیے استعمال کیا جا سکتا ہے (اس نے اوبنٹو پر کام کیا ، لیکن ونڈوز یا میک پر نہیں)۔

درج ذیل معلومات یہاں فراہم کی گئی ہیں۔

  • تکرار کی موجودہ تعداد کی اوپری حد حاصل کریں:sys.getrecursionlimit()
  • تکرار کی تعداد کی اوپری حد کو تبدیل کریں:sys.setrecursionlimit()
  • اسٹیک کا زیادہ سے زیادہ سائز تبدیل کریں:resource.setrlimit()

نمونہ کوڈ اوبنٹو پر چل رہا ہے۔

موجودہ تکرار کی حد حاصل کریں: sys.getrecursionlimit ()

موجودہ تکرار کی حد sys.getrecursionlimit () کے ساتھ حاصل کی جا سکتی ہے۔

import sys
import resource

print(sys.getrecursionlimit())
# 1000

مثال کے طور پر ، تکرار کی زیادہ سے زیادہ تعداد 1000 ہے ، جو آپ کے ماحول کے لحاظ سے مختلف ہو سکتی ہے۔ نوٹ کریں کہ جو وسائل ہم یہاں درآمد کر رہے ہیں وہ بعد میں استعمال ہوں گے ، لیکن ونڈوز پر نہیں۔

ایک مثال کے طور پر ، ہم مندرجہ ذیل سادہ تکراری فنکشن استعمال کریں گے۔ اگر ایک مثبت عدد 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 () کے ذریعے حاصل کردہ قیمت سختی سے زیادہ سے زیادہ تعداد نہیں ہے ، بلکہ ازگر کے ترجمان کی زیادہ سے زیادہ اسٹیک گہرائی ہے ، لہذا اگر تکرار کی تعداد اس قدر سے قدرے کم ہو تو بھی ایک خرابی (RecursionError) ہوگی اٹھایا جائے.

帰 限界 は 、 、 の 限界 で は 、 th th th th th th th th th th th th۔
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

ازگر میں ، معیاری لائبریری میں ریسورس ماڈیول زیادہ سے زیادہ اسٹیک سائز کو تبدیل کرنے کے لیے استعمال کیا جا سکتا ہے۔ تاہم ، ریسورس ماڈیول ایک یونکس مخصوص ماڈیول ہے اور اسے ونڈوز پر استعمال نہیں کیا جا سکتا۔

resource.getrlimit () کے ساتھ ، آپ دلیل میں بیان کردہ وسائل کی حد کو (نرم حد ، سخت حد) کے بطور حاصل کرسکتے ہیں۔ یہاں ، ہم ریسورس کی وضاحت کرتے ہیں۔

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

مثال کے طور پر ، نرم حد 8388608 (8388608 B = 8192 KB = 8 MB) اور سخت حد -1 (لامحدود) ہے۔

آپ resource.setrlimit () کے ساتھ وسائل کی حد کو تبدیل کر سکتے ہیں۔ یہاں ، نرم حد بھی -1 (کوئی حد نہیں) پر مقرر ہے۔ آپ لامحدود حد کی نمائندگی کے لیے مسلسل وسائل کو بھی استعمال کر سکتے ہیں۔

گہری تکرار ، جو اسٹیک سائز میں تبدیلی سے پہلے تقسیم کی خرابی کی وجہ سے انجام نہیں دی جا سکتی تھی ، اب انجام دی جا سکتی ہے۔

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
سوڈو کے ساتھ اسکرپٹ چلانے سے کوئی فائدہ نہیں ہوا۔ یہ نظام کی طرف سے محدود کیا جا سکتا ہے.

ایک سپر صارف کے موثر UID کے ساتھ ایک عمل کسی بھی معقول حد کی درخواست کرسکتا ہے ، جس میں کوئی حد نہیں ہے۔
تاہم ، ایک درخواست جو نظام کی طرف سے عائد کردہ حد سے تجاوز کرتی ہے پھر بھی اس کا نتیجہ ValueError ہوگا۔
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation

ونڈوز کے پاس ریسورس ماڈیول نہیں ہے ، اور میک سسٹم کی حدود کی وجہ سے زیادہ سے زیادہ اسٹیک سائز تبدیل نہیں کر سکا۔ اگر ہم کچھ طریقوں سے اسٹیک کا سائز بڑھا سکتے ہیں ، تو ہمیں تقسیم کی غلطی کو حل کرنے کے قابل ہونا چاہیے ، لیکن ہم اس کی تصدیق نہیں کر سکے۔

Copied title and URL