pypy如何处理递归?
我写了一个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