Katika Python, kuna kikomo cha juu kwa idadi ya marudio (idadi ya juu ya marudio). Ili kutekeleza kazi ya kujirudia na idadi kubwa ya simu, ni muhimu kubadili kikomo. Tumia vitendaji katika moduli ya sys ya maktaba ya kawaida.
Idadi ya marudio pia imepunguzwa na saizi ya rafu. Katika baadhi ya mazingira, moduli ya rasilimali ya maktaba ya kawaida inaweza kutumika kubadilisha ukubwa wa juu wa stack (ilifanya kazi kwa Ubuntu, lakini si kwenye Windows au mac).
Habari zifuatazo zimetolewa hapa.
- Pata kikomo cha juu cha idadi ya sasa ya marudio:
sys.getrecursionlimit()
- Badilisha kikomo cha juu cha idadi ya marudio:
sys.setrecursionlimit()
- Badilisha ukubwa wa juu zaidi wa rafu:
resource.setrlimit()
Nambari ya mfano inaendelea kwenye Ubuntu.
Pata kikomo cha sasa cha kujirudia: sys.getrecursionlimit()
Kikomo cha sasa cha kujirudia kinaweza kupatikana kwa sys.getrecursionlimit().
import sys
import resource
print(sys.getrecursionlimit())
# 1000
Katika mfano, idadi ya juu ya marudio ni 1000, ambayo inaweza kutofautiana kulingana na mazingira yako. Kumbuka kuwa rasilimali tunayoingiza hapa itatumika baadaye, lakini sio kwenye Windows.
Kama mfano, tutatumia kazi rahisi ifuatayo ya kujirudia. Ikiwa nambari kamili n imebainishwa kama hoja, nambari ya simu itakuwa n mara.
def recu_test(n):
if n == 1:
print('Finish')
return
recu_test(n - 1)
Hitilafu (RecursionError) itatolewa ikiwa utajaribu kufanya marudio zaidi ya kikomo cha juu.
recu_test(950)
# Finish
# recu_test(1500)
# RecursionError: maximum recursion depth exceeded in comparison
Kumbuka kuwa thamani iliyopatikana na sys.getrecursionlimit() sio idadi ya juu kabisa ya marudio, lakini kina cha juu cha mrundikano wa Python, kwa hivyo hata kama idadi ya marudio ni chini kidogo ya thamani hii, hitilafu (RecursionError) itatokea. kukuzwa.
再帰限界は、再帰の限界ではなく、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
Badilisha kikomo cha kujirudia: sys.setrecursionlimit()
Kikomo cha juu cha idadi ya marudio kinaweza kubadilishwa na sys.setrecursionlimit(). Kikomo cha juu kinabainishwa kama hoja.
Huruhusu urudiaji wa kina zaidi kufanywa.
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
# 2000
recu_test(1500)
# Finish
Ikiwa kikomo cha juu kilichobainishwa ni kidogo sana au kikubwa sana, hitilafu itatokea. Kizuizi hiki (mipaka ya juu na ya chini ya kikomo yenyewe) inatofautiana kulingana na mazingira.
Thamani ya juu ya kikomo inategemea jukwaa. Ikiwa unahitaji kujirudia kwa kina, unaweza kubainisha thamani kubwa zaidi ndani ya masafa inayotumika na mfumo, lakini fahamu kuwa thamani hii itasababisha mvurugiko ikiwa ni kubwa mno.
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
Idadi ya juu zaidi ya marudio pia inadhibitiwa na saizi ya rafu, kama inavyofafanuliwa inayofuata.
Badilisha ukubwa wa juu zaidi wa stack: resource.setrlimit()
Hata kama thamani kubwa imewekwa katika sys.setrecursionlimit(), haiwezi kutekelezwa ikiwa idadi ya marudio ni kubwa. Hitilafu ya sehemu hutokea kama ifuatavyo.
sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000
recu_test(10 ** 4)
# Finish
# recu_test(10 ** 5)
# Segmentation fault
Katika Python, moduli ya rasilimali katika maktaba ya kawaida inaweza kutumika kubadilisha ukubwa wa juu wa rafu. Walakini, moduli ya rasilimali ni moduli maalum ya Unix na haiwezi kutumika kwenye Windows.
- Unix Specific Services — Python 3.10.0 Documentation
- resource — Resource usage information — Python 3.10.0 Documentation
Ukitumia resource.getrlimit(), unaweza kupata kikomo cha rasilimali iliyobainishwa kwenye hoja kama nakala ya (kikomo laini, kikomo kigumu). Hapa, tunabainisha rasilimali.RLIMIT_STACK kama rasilimali, ambayo inawakilisha upeo wa juu wa rundo la simu la mchakato wa sasa.
- resource.getrlimit() — Resource usage information — Python 3.10.0 Documentation
- resource.RLIMIT_STACK — Resource usage information — Python 3.10.0 Documentation
print(resource.getrlimit(resource.RLIMIT_STACK))
# (8388608, -1)
Kwa mfano, kikomo cha laini ni 8388608 (8388608 B = 8192 KB = 8 MB) na kikomo ngumu ni -1 (bila ukomo).
Unaweza kubadilisha kikomo cha rasilimali na resource.setrlimit(). Hapa, kikomo laini pia kimewekwa -1 (hakuna kikomo). Unaweza pia kutumia rasilimali ya kudumu.RLIM_INFINIT kuwakilisha kikomo kisicho na kikomo.
Urudiaji wa kina, ambao haukuweza kufanywa kwa sababu ya hitilafu ya sehemu kabla ya mabadiliko ya ukubwa wa rafu, sasa unaweza kufanywa.
resource.setrlimit(resource.RLIMIT_STACK, (-1, -1))
print(resource.getrlimit(resource.RLIMIT_STACK))
# (-1, -1)
recu_test(10 ** 5)
# Finish
Hapa, kikomo laini kimewekwa -1 (hakuna kikomo) kwa jaribio rahisi, lakini kwa ukweli, itakuwa salama kuiweka kwa thamani inayofaa.
Kwa kuongezea, nilipojaribu kuweka kikomo laini kisicho na kikomo kwenye mac yangu pia, kosa lifuatalo lilitokea.ValueError: not allowed to raise maximum limit
Kuendesha hati na sudo hakujasaidia. Inaweza kuzuiwa na mfumo.
Mchakato ulio na UID mzuri wa mtumiaji mkuu unaweza kuomba kikomo chochote kinachokubalika, pamoja na kutokuwa na kikomo.
Hata hivyo, ombi linalozidi kikomo kilichowekwa na mfumo bado litasababisha ValueError.
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation
Windows haina moduli ya rasilimali, na mac haikuweza kubadilisha ukubwa wa juu wa rafu kwa sababu ya mapungufu ya mfumo. Ikiwa tunaweza kuongeza saizi ya rafu kwa njia fulani, tunapaswa kuwa na uwezo wa kutatua hitilafu ya sehemu, lakini hatujaweza kuthibitisha hili.