pypy如何处理递归?

5 投票
1 回答
2148 浏览
提问于 2025-04-17 03:00

我写了一个Python脚本,运行得很好,但我想看看能不能让它跑得更快。这个脚本主要是递归的。

如果我在普通的Python 2.7环境下运行,差不多需要30秒。但当我用pypy运行同样的代码时,就出现了以下错误:

RuntimeError: maximum recursion depth exceeded

我不太明白pypy到底做了什么不同的事情,因为我没有修改脚本。

有没有人能帮我理解发生了什么?

更新:
好吧,我搞明白了。增加限制后有所帮助,但我觉得我运行的是错误的文件。我在bin目录下找到一个叫py.py的文件,并且用那个。 我不太确定这个文件是干嘛的,但它比普通的Python慢。我不得不搜索找到‘pypy-c’,现在似乎可以正常工作了。

1 个回答

5

正如你在更新中提到的,你的问题是你在使用 py.py(这个是用来在 CPython 上运行 PyPy 的解释器)。PyPy 的递归限制比 CPython 通常要高。你可以使用 sys.setrecursionlimit() 来增加递归的限制,而 sys.getrecursionlimit() 并不能告诉你实际的递归限制是多少。

PyPy 1.6.0:

>>>> sys.getrecursionlimit()
100

>>>> def infinite(level=0):
....     print level
....     return infinite(level+1)
.... 

>>> infinite()
<snip>
1010
Traceback (most recent call last):
  File "<console>", line 2, in infinite
RuntimeError: maximum recursion depth exceeded

>>> sys.setrecursionlimit(sys.maxint)

>>> infinite()
<snip>
9769
zsh: segmentation fault  pypy

撰写回答