Каков трудный предел рекурсии для Linux, Mac и Windows?

Python sys модуль обеспечивает функцию setrecursionlimit это позволяет Вам изменить максимальный предел рекурсии Python. В документах говорится:

Максимально возможный предел зависим от платформы.

Мой вопрос: Каковы максимально возможные пределы для различных платформ под CPython? Я хотел бы знать значения для Linux, Mac и Windows.

ОБНОВЛЕНИЕ: мы можем избежать, чтобы "Вы сделали его неправильно" ответы? Я знаю, что, пытаясь сделать очень глубокая рекурсия обычно является плохой идеей. Я рассмотрел за и против в своей определенной ситуации и решил, что хочу сделать это.

31
задан Georgy 5 August 2019 в 17:56
поделиться

2 ответа

Не следует злоупотреблять рекурсивными вызовами в CPython. У него нет хвостовой оптимизации, вызовы функций используют много памяти и времени обработки. Эти ограничения могут не применяться к другим реализациям, их нет в чертежах.

В CPython рекурсия подходит для обхода структур данных (где ограничение в 1000 должно быть достаточно для всех), но не для алгоритмов. Если бы мне пришлось реализовать, скажем, алгоритмы, связанные с графами, и достичь предела рекурсии, я бы либо реализовал свой собственный стек и использовал бы итерации, либо поискал бы библиотеки, реализованные на C / C ++ / любом другом, прежде чем увеличивать ограничение вручную.

2
ответ дан 27 November 2019 в 22:41
поделиться

В Windows (по крайней мере) sys.setrecursionlimit - это еще не все. Жесткое ограничение устанавливается для каждого потока, и вам нужно вызвать threading.stack_size и создать новый поток, как только вы достигнете определенного ограничения. (Я думаю, 1 МБ, но не уверен). Я использовал этот подход, чтобы увеличить стек до 64 МБ.

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()

Я не пытался выяснить, какие ограничения могут быть на threading.stack_size , но не стесняйтесь пробовать ... вот где вам нужно искать.

Таким образом, sys.setrecursionlimit - это просто ограничение, установленное самим интерпретатором. threading.stack_size позволяет вам управлять фактическим ограничением, налагаемым ОС. Если вы сначала достигнете последнего предела, Python просто полностью выйдет из строя.

33
ответ дан 27 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: