35

Python のsysモジュールには、 Python の最大再帰制限を変更できる関数が用意されています。 setrecursionlimitドキュメントは言う:

可能な上限はプラットフォームによって異なります。

私の質問は次のとおりです: CPython の下で、さまざまなプラットフォームで可能な最大の制限は何ですか? Linux、Mac、および Windows の値を知りたいです。

更新:「あなたのやり方は間違っている」という回答は避けてください。非常に深い再帰を行おうとするのは、通常は悪い考えであることを私は知っています。私は自分の特定の状況での長所と短所を検討し、それをやりたいと決めました.

4

2 に答える 2

35

Windowsでは(少なくとも)、それだけでsys.setrecursionlimitはありません。ハード制限はスレッドごとに設定されておりthreading.stack_size、特定の制限に達したら、新しいスレッドを呼び出して作成する必要があります。(私は1MBだと思いますが、確かではありません)私はこのアプローチを使用して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()

制限があるかどうかは確認していませんがthreading.stack_size、お気軽に試してみてください...ここを確認する必要があります。

要約すると、これsys.setrecursionlimitはインタプリタ自体によって強制される制限にすぎません。 threading.stack_sizeOSによって課される実際の制限を操作できます。最初に後者の制限に達すると、Pythonは完全にクラッシュします。

于 2010-05-27T02:30:14.030 に答える
2

CPython で再帰呼び出しを使いすぎてはいけません。末尾の最適化がなく、関数呼び出しは大量のメモリと処理時間を使用します。これらの制限は他の実装には適用されない可能性があり、設計図にはありません。

CPython では、再帰はデータ構造をトラバースするには問題ありませんが (1000 の制限は誰にとっても十分なはずです)、アルゴリズムには問題ありません。たとえば、グラフ関連のアルゴリズムを実装して再帰の制限に達した場合、手動で制限を上げる前に、独自のスタックを実装して反復を使用するか、C/C++ などで実装されたライブラリを探します。

于 2010-05-26T22:27:54.300 に答える