是否有一种通用方法可以使深度递归Python函数在不改变系统递归限制的情况下工作?

问题描述 投票:0回答:1

我们有一个包含相当多递归函数的Python代码库,它们可能会遇到深度递归并打破默认Python解释器设置的递归限制。我们过去曾使用

sys.setrecursionlimit()
来使它们运行良好。但现在这些功能需要放入共享模块中并在其他用户的环境中运行。我们意识到在共享模块的代码中调用
sys.setrecursionlimit()
可能不是一个好主意,因为这会改变用户的全局设置。即使我们总是在函数返回之前更改设置,用户也可能正在运行多线程程序并仅在其中一个线程中调用我们的函数,他们可能不希望其他线程受到设置更改的影响。 (如果我的理解有误,请指正)

因此,我们期待一些方法可以使我们的递归函数发挥作用,同时保持系统递归限制不变。

在问这个问题之前,我在网上查了很多资料。它们真的很有用,我现在可以从这些资源中得到两个结论:

  1. 如果可能,请使用

    sys.setrecursionlimit()
    更改递归限制,或使用上下文管理器等技巧来更改此设置,然后恢复回来。 -- 正如之前所说,我们认为这不是共享模块的最佳选择。

  2. 将递归函数的代码更改为迭代函数。大多数帖子建议手动更改代码,首先研究函数,然后根据具体情况重构它们。这是可能的,但需要大量的手动工作,因为我们的代码库并不小,而且一些递归函数非常复杂。 这篇文章展示了将复杂的递归函数更改为迭代函数是多么困难的示例。当然,如果有必要的话,我们会依赖这最后的手段,但现在我们正在寻找其他一些通用的方法。

当我说“通用”时,我的意思是只需要简单的改变,而不需要深入理解函数的逻辑并彻底手工设计迭代代码。这里的“通用”并不意味着小的代码更改,它更多地意味着更少的手动工作,或者“自动”。

一些帖子中,我发现可以通过使用名为TCO的库来消除尾递归。因此,只需添加装饰器并进行一些通用文本替换即可更改所有尾递归函数。这非常接近我们正在寻找的解决方案。我还学习了trampoline,它也适用于尾递归。然而,我们的代码库不仅包括尾递归

问题是:在不调用

sys.setrecursionlimit()
的情况下,有没有一种方法可以使深度递归函数(不仅仅是尾递归函数)工作,并且以最少的手动工作来更改遗留代码?有没有自动重构工具可以做到这一点?

python recursion refactoring automated-refactoring
1个回答
0
投票

没有必要,python的

setrecursionlimit
改变了特定于当前解释器进程的限制。不是实际的系统限制。 如果您更改一个进程中的限制,则另一进程中的限制将保持不变。您可以通过启动两个 python shell 并读取/设置递归限制来尝试一下。你会发现他们是完全独立的。

© www.soinside.com 2019 - 2024. All rights reserved.