2010-05-26 10 views
30

Python sys módulo provides a functionsetrecursionlimit que le permite cambiar el límite máximo de recursión de Python. Los documentos dicen:Python: ¿Cuál es el límite de recursión difícil para Linux, Mac y Windows?

El límite máximo posible depende de la plataforma.

Mi pregunta es: ¿Cuál es el límite más alto posible para varias plataformas, bajo CPython? Me gustaría saber los valores para Linux, Mac y Windows.

ACTUALIZACIÓN: ¿Podemos evitar las respuestas "Lo estás haciendo mal"? Sé que tratar de hacer recursiones muy profundas suele ser una mala idea. He considerado los pros y los contras en mi situación específica y decidí que quiero hacerlo.

+2

¿Eso no también Depende de cuánta memoria tienes, etc.? – Justin

+0

Probablemente equivalente a "¿cuál es el tamaño máximo de pila de setrlimit posible en {os}". Para Linux, apuesto casi toda tu memoria RAM de usuario, pero no lo sé. El valor puede ser manipulado con 'resource.setrlimit': http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

Respuesta

1

No debe usar en exceso las llamadas recursivas en CPython. No tiene optimización de cola, las llamadas a función usan mucha memoria y tiempo de procesamiento. Es posible que esos límites no se apliquen a otras implementaciones, no están en los planos.

En CPython, la recursión está bien para atravesar estructuras de datos (donde un límite de 1000 debería ser suficiente para todos) pero no para algoritmos. Si tuviera que implementar, digamos, algoritmos relacionados con gráficos y alcanzar el límite de recursión, implementaría mi propia pila y usaría iteraciones, o buscaría bibliotecas implementadas en C/C++/lo que sea antes de aumentar el límite manualmente.

+6

Gracias por la información, pero es más un comentario perspicaz que una respuesta . (Y como respuesta, es del tipo "Lo estás haciendo mal"). –

+0

Gracias @Xavier. De hecho, en esta profesión, casi todo lo que aprendí de los demás era una sombra de "lo estás haciendo mal". –

+0

Estoy completamente de acuerdo con usted. No necesitas recursividad. No necesitas límite de pila Si estás causando el Desbordamiento de pila, lo estás haciendo mal. '= P' –

30

En Windows (al menos), sys.setrecursionlimit no es la historia completa. El límite estricto es por subproceso y debe llamar al threading.stack_size y crear un nuevo subproceso una vez que alcanza un límite determinado. (Creo que 1MB, pero no estoy seguro). He usado este enfoque para aumentarlo a una pila de 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() 

No he probado para ver qué límites puede haber en threading.stack_size, pero no dude en probar ... que es donde tiene que mirar.

En resumen, sys.setrecursionlimit es solo un límite impuesto por el propio intérprete. threading.stack_size le permite manipular el límite real impuesto por el sistema operativo. Si tocas el último límite primero, Python simplemente se bloqueará por completo.

+0

¿Qué debería poner en lugar de 'target = main' si no tengo un objeto 'principal'? – mmj

+0

Usted pone cualquier nombre de función allí. No tiene que ser llamado main. – FogleBird

+0

Cualquier valor que pongo como tamaño de pila no puede resolver mi problema de límite de recursividad. Sé que la profundidad de recursión real que necesito es inferior a 100 ky logré ejecutarla bajo Linux, pero no bajo Windows. – mmj

6
  • Para Windows: 2000
  • Para Linux: 2147483647 (2^31 - 1)
  • Para Mac, en mi Pro MacBook el límite predeterminado es: 1000
+2

Fuente? '' '' '' '' – fabspro

+1

sys.getrecursionlimit() – WhoSayIn

+2

y por cierto, dado que ahora tengo una MacBook Pro, puedo confirmar que el límite de recursión predeterminado en OS X es 1000 – WhoSayIn

Cuestiones relacionadas