python - Python 索引时的递归限制

标签 python python-3.x recursion stack-overflow

我在玩弄 recursion limit在 Python 中,可以使用 sys.setrecursionlimit(limit) 动态更改。下面的代码演示了整数 limit 完全对应于递归函数调用所允许的最大深度。

对于使用 [] 的递归索引,似乎适用相同的递归限制,但显然因子为 3,这意味着我可以索引深度是我的三倍可以打电话: enter image description here

上面的图是由下面的代码生成的。

import itertools, sys
import numpy as np
import matplotlib.pyplot as plt

limits = np.arange(10, 500, 100)

# Find max depth of recursive calls
maxdepth = []
for limit in limits:
    sys.setrecursionlimit(limit)
    try:
        n = [0]
        def fun(n=n):
            n[0] += 1
            fun()
        fun()
    except RecursionError:
        maxdepth.append(n[0])
a, b = np.polyfit(limits, maxdepth, 1)
plt.plot(limits, maxdepth, '*')
plt.plot(limits, a*limits + b, '-', label='call')
plt.text(np.mean(limits), a*np.mean(limits) + b, f'slope = {a:.2f}')

# Find max depth of getitem
maxdepth = []
n = 0
l = []; l.append(l)
for limit in limits:
    sys.setrecursionlimit(limit)
    for n in itertools.count(n):
        try:
            eval('l' + '[-1]'*n)
        except RecursionError:
            break
    maxdepth.append(n)
a, b = np.polyfit(limits, maxdepth, 1)
plt.plot(limits, maxdepth, '*')
plt.plot(limits, a*limits + b, '-', label='getitem')
plt.text(np.mean(limits), a*np.mean(limits) + b, f'slope = {a:.2f}')

plt.xlabel('Recursion limit')
plt.ylabel('Max depth')
plt.legend()
plt.savefig('test.png')

为了测试递归索引,我将一个列表 l 附加到其自身并构造一个长文字 [-1][-1][-1]... ,其中然后我动态地评估l

问题:解释 3 的因数。

最佳答案

l[-1][-1]...没有递归——它编译为“push l;用最后一个元素替换栈顶;代替…”。您的 RecursionError 来自编译长字符串。

字面上有一个 factor of 3用于近似字节编译器与解释器本身的堆栈使用情况。 (Python 2 没有这样的限制,只会在此类表达式上崩溃。)

关于python - Python 索引时的递归限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54411826/

相关文章:

python - 如何在 RDKit 中以 SVG(高分辨率)形式突出显示带有粗红线的分子的子结构

python - Pandas 将文本文件转换为 CSV

python - NoneType 对象不可迭代

python - python如何在赋值运算符后赋值

c# - 这个 nameof() 真的是递归调用吗?

python - 正在寻找可能更好的方法来使用 Glom 获取嵌套数据?

python - 似乎同时安装了 NumPy 1.8.2 和 1.10.4,还有 rllab 和 OpenAI gym 之间的兼容性问题?

python - 使用类作为其方法中参数的类型提示

java - 使用递归和子字符串方法向后显示字符串

java - 在 Tree 中插入一个节点,每个节点有 2 个以上的子节点