Как pypy обрабатывает рекурсии? - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть скрипт, который я написал на python, и он отлично работает, но мне было интересно посмотреть, смогу ли я ускорить его. Это в основном рекурсивный скрипт.

Если я запускаю его в обычном Python 2.7, это занимает около 30 секунд. Когда я запускаю ту же самую вещь, используя pypy, я получаю следующую ошибку:

RuntimeError: maximum recursion depth exceeded

Я не уверен, что pypy делает по-другому, потому что я не модифицирую скрипт.

Может кто-нибудь помочь мне понять, что происходит?

Обновление: хорошо, я понял это. Увеличение лимита помогло, но я думаю, что я запускаю не тот файл. Я нашел файл в каталоге bin с именем py.py и использовал его. Я не уверен, что файл делает, но он медленнее, чем обычный питон. Мне пришлось искать и находить «pypy-c», кажется, теперь работает.

1 Ответ

4 голосов
/ 24 сентября 2011

Как вы предполагаете в своем обновлении, ваша проблема заключалась в том, что вы использовали py.py (который предназначен для запуска интерпретатора PyPy поверх CPython). 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
...