পাইথন পুনরাবৃত্তি সীমা পরীক্ষা করুন এবং পরিবর্তন করুন (যেমন 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) হবে জেগে উঠুন.

再帰限界は、再帰の限界ではなく、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

পাইথনে, স্ট্যান্ডার্ড লাইব্রেরির রিসোর্স মডিউলটি সর্বাধিক স্ট্যাকের আকার পরিবর্তন করতে ব্যবহার করা যেতে পারে। যাইহোক, রিসোর্স মডিউল একটি ইউনিক্স-নির্দিষ্ট মডিউল এবং উইন্ডোজে ব্যবহার করা যাবে না।

resource.getrlimit() এর সাহায্যে আপনি আর্গুমেন্টে উল্লিখিত সম্পদের সীমাটি (নরম সীমা, হার্ড লিমিট) এর একটি টিপল হিসাবে পেতে পারেন। এখানে, আমরা resource.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
সুডো দিয়ে স্ক্রিপ্ট চালানো সাহায্য করেনি। এটি সিস্টেম দ্বারা সীমাবদ্ধ হতে পারে।

একটি সুপার ব্যবহারকারীর কার্যকর ইউআইডি সহ একটি প্রক্রিয়া কোন সীমা সহ যেকোনো যুক্তিসঙ্গত সীমার অনুরোধ করতে পারে।
যাইহোক, একটি অনুরোধ যা সিস্টেমের দ্বারা আরোপিত সীমা অতিক্রম করে তখনও একটি ValueError হবে৷
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation

উইন্ডোজের কোনো রিসোর্স মডিউল নেই, এবং সিস্টেমের সীমাবদ্ধতার কারণে ম্যাক সর্বোচ্চ স্ট্যাকের আকার পরিবর্তন করতে পারেনি। যদি আমরা কিছু উপায়ে স্ট্যাকের আকার বাড়াতে পারি, তাহলে আমাদের সেগমেন্টেশন ফল্টটি সমাধান করতে সক্ষম হওয়া উচিত, কিন্তু আমরা এটি নিশ্চিত করতে পারিনি।

Copied title and URL