Пожалуйста, прочтите новое правило об ограничении использования AI-инструментов. ×

Блог пользователя Shtrix

Автор Shtrix, 13 лет назад, По-русски
Недавно занялся изучением питона и уперся в проблему с переполнением стека.

Случай нулевой, достигается придел рекурсивных вызовов:
import sys
def rec(x):
    print x,
    if x < 1000:
        rec(x + 1)
rec(0)

Случай первый, переполнения стека не наблюдается, полет в норме:
import sys
sys.setrecursionlimit(2000000)
def rec(x):
    print x,
    if x < 1000:
        rec(x + 1)
rec(0)

Случай второй, достигается переполнение стека:
import sys
sys.setrecursionlimit(2000000)
def rec(x):
    print x,
    if x < 10000:
        rec(x + 1)
rec(0)

После долгого поиска я так и не нашел никаких способов увеличения стека. Жизнь с максимумом в 10 тысяч рекурсивных вызвов меня сильно удручает. Соответственно, вопрос, кто-нибудь знает какие-то хаки для глубокой рекурсии в питоне?
  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Stack в питоне ограничен двумя тысячами, а обойти можно используя list как стек например.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Последнее число которое выводит третий код: 9663.
На счет list-a, я знаю что можно много чего применить для обхода использования рекурсии, но меня как раз больше интресует нет ли какой-то нативной поддержки увеличенния стека.
13 лет назад, # |
Rev. 4   Проголосовать: нравится +5 Проголосовать: не нравится
Действительно не 2000, у меня до 23696 доходит :)


13 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
Вроде на CF подобная тема уже обсуждалась, но ссылку я не нашел.
Если работать под Win то дело скорее всего в том, что сам интерпретатор скомпилирован с дефолтным размером стека, который из скрипта уже никак не увеличишь
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Спасибо, этот тред очень в тему. Как не удивительно, они обсуждают ту же задачу на которой споткнулся и я. Насколько я понял, изнутри кода это сделать не выйдет. Надежда, выходит, разве на то что администрация озадачится увеличением стека для питон солюшенов.
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Честно говоря, на питоне вообще лучше избегать рекурсивных реализаций, учитывая что он и так небыстрый язык. Хотя, на деле разница в скорости и не всегда значительная.