Di Python de, ji jimara vegeran re sînorê herî jor heye (hejmara vegera herî zêde). Ji bo pêkanîna fonksiyona paşvekişandinê bi hejmarek mezin a bangan, pêdivî ye ku sînor were guheztin. Fonksiyonên di modulasyona sys -a pirtûkxaneya standard de bikar bînin.
Hejmara paşvekişandinê jî ji hêla mezinahiya stanê ve sînordar e. Di hin hawîrdoran de, modula çavkaniyê ya pirtûkxaneya standard dikare were bikar anîn da ku mezinahiya stacka herî zêde were guheztin (ew li Ubuntu xebitî, lê ne li ser Windows an mac).
Agahdariya jêrîn li vir tê dayîn.
- Sînorê jorîn ê hejmara vegerandinên heyî bistînin:
sys.getrecursionlimit()
- Sînora jorîn a hejmara vegeran biguhezînin:
sys.setrecursionlimit()
- Mezinahiya herî zêde ya stûyê biguherînin:
resource.setrlimit()
Koda nimûneyê li Ubuntu dixebite.
Sînora paşvekişandinê ya heyî bistînin: sys.getrecursionlimit ()
Sînorê vegera nuha dikare bi sys.getrecursionlimit () were wergirtin.
import sys
import resource
print(sys.getrecursionlimit())
# 1000
Di mînakê de, hejmara vegera herî zêde 1000 e, ku dibe ku li gorî hawîrdora we cûda bibe. Têbînî ku çavkaniya ku em li vir import dikin dê paşê were bikar anîn, lê ne li ser Windows.
Wek mînak, em ê fonksiyona paşvekêşanê ya hêsan a jêrîn bikar bînin. Ger jimareyek n erênî wekî argûman were destnîşan kirin, dê hejmara bangewaziyan n car be.
def recu_test(n):
if n == 1:
print('Finish')
return
recu_test(n - 1)
Ger hûn hewl bidin ku ji sînorê jorîn zêdetir vegerandinê bikin xeletiyek (RecursionError) dê were rakirin.
recu_test(950)
# Finish
# recu_test(1500)
# RecursionError: maximum recursion depth exceeded in comparison
Zanibe ku nirxa ku ji hêla sys.getrecursionlimit () ve hatî wergirtin bi tundî ne hejmara vegera herî zêde ye, lê kûrahiya stûyê ya herî zêde ya wergêrê Python e, ji ber vê yekê jî ger ku hejmara vegeran ji vê nirxê piçûktir be, dê xeletiyek (RecursionError) bên rakirin.
Python 、 帰 限界 は 、 帰 帰 帰 帰 、 、 、 、 、 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
Sînorê paşvedanê biguherînin: sys.setrecursionlimit ()
Sînora jorîn a hejmara vegeran dikare ji hêla sys.setrecursionlimit () ve were guheztin. Sînora jorîn wekî argûman tête diyar kirin.
Destûrê dide ku vegerandinek kûrtir were kirin.
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
# 2000
recu_test(1500)
# Finish
Ger sînorê jorîn ê diyarkirî pir piçûk an pir mezin be, dê xeletiyek çêbibe. Ev sînor (sînorên jorîn û jêrîn ên sînor bixwe) li gorî hawîrdorê diguhere.
Nirxa herî zêde ya sînor bi platformê ve girêdayî ye. Heke hûn hewceyê vegera kûr in, hûn dikarin di navbêna ku ji hêla platformê ve hatî piştgirî kirin de nirxek mezintir diyar bikin, lê hay jê hebin ku ger ew pir mezin be ev nirx dê bibe sedema têkçûnê.
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
Hejmara herî zêde ya vegeran jî ji hêla mezinahiya stûyê ve tê sînorkirin, wekî ku li jêr tê rave kirin.
Mezinahiya herî zêde ya stackê biguherînin: resource.setrlimit ()
Her çend nirxek mezin di sys.setrecursionlimit () de were danîn jî, ger ku jimara vegeran pir be, dibe ku ew neyê darve kirin. Xeletiyek dabeşkirinê wiha pêk tê.
sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000
recu_test(10 ** 4)
# Finish
# recu_test(10 ** 5)
# Segmentation fault
Di Python de, modulê çavkaniyê di pirtûkxaneya standard de dikare were bikar anîn da ku mezinahiya stackê ya herî zêde were guheztin. Lêbelê, modula çavkaniyê modulek taybetî ya Unix-ê ye û li ser Windows-ê nayê bikar anîn.
- Unix Specific Services — Python 3.10.0 Documentation
- resource — Resource usage information — Python 3.10.0 Documentation
Bi resource.getrlimit (), hûn dikarin sînorê çavkaniya ku di argumanê de hatî destnîşan kirin wekî pirjimar (tixûbê nerm, sînorê hişk) bistînin. Li vir, em çavkaniyê diyar dikin.RLIMIT_STACK wekî çavkanî, ku mezinahiya herî zêde ya koma banga pêvajoya heyî temsîl dike.
- 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)
Di mînakê de, sînorê nerm 8388608 e (8388608 B = 8192 KB = 8 MB) û sînorê dijwar -1 e (bêsînor).
Hûn dikarin sînorê çavkaniyê bi resource.setrlimit () biguherînin. Li vir, sînorê nerm jî -1 (bê sînor) tê danîn. Her weha hûn dikarin çavkaniya domdar bikar bînin.RLIM_INFINIT ku sînorê bêsînor temsîl bike.
Vegerandina kûr, ku ji ber xeletiya dabeşkirinê berî guheztina mezinahiya stûyê nayê kirin, naha dikare were kirin.
resource.setrlimit(resource.RLIMIT_STACK, (-1, -1))
print(resource.getrlimit(resource.RLIMIT_STACK))
# (-1, -1)
recu_test(10 ** 5)
# Finish
Li vir, sînorê nerm ji bo ezmûnek hêsan li -1 (bê sînor) tê danîn, lê di rastiyê de, ew ê ewletir be ku ew bi nirxek guncan ve were sînorkirin.
Wekî din, dema ku min hewl da ku li ser macê xwe jî sînorek nerm a bêsînor bidim, xeletiya jêrîn çêbû.ValueError: not allowed to raise maximum limit
Bi nivîsandina sudo re nivîskarî ne arîkar bû. Dibe ku ji hêla pergalê ve were sînorkirin.
Pêvajoyek bi UID -a bandorker a superuser dikare her tixûbek maqûl bixwaze, bê sînor jî.
Lêbelê, daxwazek ku sînorê ku ji hêla pergalê ve hatî destnîşan kirin derbas bike dê dîsa jî bibe sedema ValueError.
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation
Windows ne xwediyê modulek çavkaniyê ye, û mac ji ber tixûbên pergalê nekare mezinahiya herî zêde ya stakê biguhezîne. Ger em dikarin bi hin awayan mezinahiya stikê zêde bikin, divê em karibin xeletiya dabeşkirinê çareser bikin, lê me nekariye vê yekê piştrast bikin.