2010-05-26 7 views
30

Python's sys module provides a functionsetrecursionlimit che consente di modificare il limite massimo di ricorsione di Python. I documenti dicono:Python: qual è il limite di ricorsione per Linux, Mac e Windows?

Il limite massimo possibile dipende dalla piattaforma.

La mia domanda è: quali sono i limiti più alti possibili per varie piattaforme, in CPython? Mi piacerebbe conoscere i valori per Linux, Mac e Windows.

AGGIORNAMENTO: Per favore possiamo evitare le risposte "Stai sbagliando"? So che provare a fare ricorsioni molto profonde è di solito una cattiva idea. Ho considerato i pro e i contro nella mia situazione specifica e ho deciso che volevo farlo.

+2

Non che anche dipende da quanta memoria hai, ecc. ?? – Justin

+0

Probabilmente equivalente a "qual è la massima dimensione di stack setrlimit possibile su {os}". Per Linux, scommetto quasi tutta la tua RAM userland, ma non lo so. Il valore può essere modificato con 'resource.setrlimit': http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

risposta

1

Non si devono abusare delle chiamate ricorsive in CPython. Non ha ottimizzazione di coda, le chiamate di funzione utilizzano molta memoria e tempo di elaborazione. Questi limiti potrebbero non essere applicabili ad altre implementazioni, non è nei progetti.

In CPython, la ricorsione va bene per attraversare strutture di dati (dove un limite di 1000 dovrebbe essere sufficiente per tutti) ma non per gli algoritmi. Se dovessi implementare, diciamo, algoritmi relativi al grafico e raggiungere il limite di ricorsione, implementerei il mio stack e userei le iterazioni, o cercherò librerie implementate in C/C++/qualunque cosa prima di aumentare il limite manualmente.

+6

Grazie per le informazioni, ma è più un commento perspicace che una risposta . (E come risposta, è del tipo "Stai sbagliando"). –

+0

Grazie a @ Saver. In effetti, in questa professione, praticamente tutto quello che ho imparato dagli altri era l'ombra di "stai sbagliando". –

+0

Sono completamente d'accordo con te. Non hai bisogno di ricorsione. Non hai bisogno di limite di stack. Se stai causando overflow dello stack, stai sbagliando. '= P' –

30

Su Windows (almeno), sys.setrecursionlimit non è la storia completa. Il limite rigido è su una base per thread e devi chiamare threading.stack_size e creare una nuova discussione una volta raggiunto un certo limite. (Penso 1MB, ma non sono sicuro) Ho usato questo approccio per aumentare lo stack di 64MB.

import sys 
import threading 

threading.stack_size(67108864) # 64MB stack 
sys.setrecursionlimit(2 ** 20) # something real big 
           # you actually hit the 64MB limit first 
           # going by other answers, could just use 2**32-1 

# only new threads get the redefined stack size 
thread = threading.Thread(target=main) 
thread.start() 

non ho cercato di vedere quali limiti ci potrebbe essere il threading.stack_size, ma sentitevi liberi di provare ... è lì che è necessario guardare.

In sintesi, sys.setrecursionlimit è solo un limite applicato dall'interprete stesso. threading.stack_size consente di modificare il limite effettivo imposto dal sistema operativo. Se si colpisce prima quest'ultimo limite, Python si arresterà completamente.

+0

Cosa dovrei inserire al posto di 'target = main' se non ho un oggetto 'principale'? – mmj

+0

Hai inserito qualsiasi nome di funzione lì. Non deve essere chiamato principale. – FogleBird

+0

Qualsiasi valore inserito come dimensione dello stack non è in grado di risolvere il problema del limite di ricorsione. So che la vera profondità di ricorsione di cui ho bisogno è inferiore a 100k e sono riuscito a eseguirlo sotto Linux, ma non sotto Windows. – mmj

6
  • Per Windows: 2000
  • Per Linux: 2147483647 (2^31 - 1)
  • Per Mac, sul mio Pro il limite predefinito MacBook è: 1000
+2

Source? '' '' '' ' – fabspro

+1

sys.getrecursionlimit() – WhoSayIn

+2

e comunque, dato che ora ho un MacBook Pro, posso confermare che il limite predefinito di ricorsione su OS X è 1000 – WhoSayIn

Problemi correlati