one*_*ach 0 python tail-recursion
我有一个python方法,可以不时执行一些任务.我发现最简单的方法是写:
class MyClass:
def a(self):
#perform the task
time.sleep(time_to_sleep)
self.a()
Run Code Online (Sandbox Code Playgroud)
但是该方法应该运行很长时间,可能持续数月,这意味着它可以递归调用方法达10 ^ 4次.
这样做有风险吗?
如果您无限期地继续递归函数,迟早会出现以下错误 -
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)
一个简单的例子来说明这一点 -
>>> def a():
... global i
... i += 1
... a()
Run Code Online (Sandbox Code Playgroud)
然后我使用as运行此功能 -
>>> i = 0
>>> a()
Run Code Online (Sandbox Code Playgroud)
这给了我上面的错误,然后当我打印i它的值是999.所以迟早你可以得到那个错误.
您也可以通过调用来更改此限制,sys.setrecursionlimit()但我不建议这样做,因为您可能会在达到限制之前结束堆栈(更简单的方法是使用while循环,如下面的答案中所示) -
import sys
sys.setrecursionlimit(<limit>)
Run Code Online (Sandbox Code Playgroud)
或者你也可以得到 - MemoryError- 如果你在本地命名空间中存储大量数据,因为你从来没有真正从递归调用返回,所以调用函数的本地命名空间永远不会被清除.所以你甚至可以在达到最大递归限制之前最终炸掉你的记忆.
你正在尝试做的简单方法是使用while循环,例如 -
class MyClass:
def a(self):
while True:
#perform the task
time.sleep(time_to_sleep)
Run Code Online (Sandbox Code Playgroud)