2010-05-26 32 views
30

Python的sys模塊provides a functionsetrecursionlimit可讓您更改Python的最大遞歸限制。該文檔說:Python:什麼是Linux,Mac和Windows的硬遞歸限制?

可能的最高限制是平臺相關的。

我的問題是:在CPython下各種平臺的最高可能極限是多少?我想知道Linux,Mac和Windows的價值。

更新:我們可以避免「你做錯了」的答案嗎?我知道試圖做非常深的遞歸通常是一個壞主意。我在我的具體情況中考慮了利弊,並決定我想要這樣做。

+2

不還取決於你有多少內存等等。 – Justin 2010-05-26 22:18:11

+0

可能相當於「什麼是{os}上最大可能的setrlimit堆棧大小」。對於Linux,我敢打賭幾乎所有的用戶態RAM,但我不知道。值可以通過'resource.setrlimit'操作:http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script – 2017-01-28 23:51:06

回答

1

您不應該過度使用CPython中的遞歸調用。它沒有尾部優化,函數調用使用了大量的內存和處理時間。這些限制可能不適用於其他實現,它不在藍圖中。

在CPython中,遍歷數據結構(對於每個人來說極限值應該足夠大1000)的遞歸是正確的,但對於算法則不適用。如果我要實現圖表相關的算法並達到遞歸極限,那麼我會實現自己的堆棧並使用迭代,或者在用手提高限制之前查找以C/C++ /實現的庫。

+6

感謝您的信息,但它更多的是一個有見地的評論比答案。 (作爲答案,它是「你做錯了」類型。) – 2010-05-26 22:33:50

+0

謝謝@Xavier。事實上,在這個行業裏,我從別人身上學到的東西幾乎都是「你做錯了」的陰影。 – 2010-05-26 23:01:58

+0

我完全同意你的看法。你不需要遞歸。你不需要堆棧限制。如果你導致堆棧溢出,你做錯了。 '= P' – 2010-05-26 23:17:24

30

在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_size可讓您操縱操作系統施加的實際限制。如果你首先達到後者的限制,Python將會完全崩潰。

+0

如果我沒有'main'對象,應該如何替換'target = main'? – mmj 2012-04-18 00:15:24

+0

您可以在其中放入任何函數名稱。它不必被稱爲主要的。 – FogleBird 2012-04-18 01:08:26

+0

作爲堆棧大小放入的任何值都無法解決遞歸限制問題。我知道我需要的實際遞歸深度在100k以下,我設法在Linux下運行它,但不能在Windows下運行。 – mmj 2012-04-18 02:01:18

6
  • 對於Windows:2000
  • 對於Linux:2147483647(2^31 - 1)
  • 對於Mac,在我的MacBook Pro的默認限制爲:1000
+2

來源?''''''' – fabspro 2014-02-01 02:44:31

+1

sys.getrecursionlimit() – WhoSayIn 2014-02-01 09:04:52

+2

順便說一句,既然我現在有一臺MacBook Pro,我可以確認OS X上的默認遞歸限制是1000 – WhoSayIn 2014-02-02 12:23:14