Ped*_*rte 5 python stack interpreter
从文档:
sys.getrecursionlimit()返回递归限制的当前值,即Python解释器堆栈的最大深度.此限制可防止无限递归导致C堆栈溢出并导致Python崩溃.它可以通过setrecursionlimit()设置.
我正在腌制一个对象时达到递归限制.我正在腌制的物体只有几层嵌套,所以我对发生的事情感到有些困惑.
我已经能够通过以下黑客来规避这个问题:
try:
return pickle.dumps(x)
except:
try:
recursionlimit = getrecursionlimit()
setrecursionlimit(2*recursionlimit)
dumped = pickle.dumps(x)
setrecursionlimit(recursionlimit)
return dumped
except:
raise
Run Code Online (Sandbox Code Playgroud)
在不同的上下文中测试上述片段有时会导致第一个片段成功try,有时它会导致第二个片段成功try.到目前为止,我还没有把它raise作为例外.
为了进一步调试我的问题,有一种方法可以获得堆栈的当前深度.这将允许我验证进入的堆栈深度是否确定上面的片段是否将在第一个try或第二个上成功.
标准库是否提供了获取堆栈深度的函数,如果没有,我该如何获取它?
def get_stack_depth():
# what goes here?
Run Code Online (Sandbox Code Playgroud)
zvo*_*one 12
你可以看到整个调用堆栈inspect.stack(),所以目前采取的深度将是len(inspect.stack()).
另一方面,我猜你在"超出最大递归深度"异常时提出了完整的堆栈.堆栈跟踪应该显示出错的原因.
如果速度是一个问题,绕过检查模块的速度会更快.
def get_stack_size():
"""Get stack size for caller's frame.
%timeit len(inspect.stack())
8.86 ms ± 42.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit get_stack_size()
4.17 µs ± 11.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
"""
size = 2 # current frame and caller's frame always exist
while True:
try:
sys._getframe(size)
size += 1
except ValueError:
return size - 1 # subtract current frame
Run Code Online (Sandbox Code Playgroud)