【发布时间】:2018-08-27 16:47:50
【问题描述】:
递归涉及大量开销是python中的一个众所周知的问题。如此之多,即使是相对较浅的递归调用也会导致程序崩溃。一种可能的解决方法是在 C 中实现花哨的递归算法,并提供 python 钩子。但是,众所周知,算法的递归实现几乎无论如何都比循环更昂贵,除非您的编译器识别出一些非常具体的机会(例如尾递归)来循环整个业务.
Anyhoo,由于递归涉及函数调用的开销,我想知道在 python 和 C 中函数调用(以及递归)的相对开销是多少?我意识到我可以timeit,但我希望有一个原则性的解释。 python函数调用与C函数调用的全部内容是什么?另外,python 和 C 之间的函数调用堆栈是否存在差异会影响深度调用堆栈的性能?
【问题讨论】:
-
您想在 C 中实现递归算法,以便在堆栈溢出时得到一个段错误而不是一个很好的异常? =P
-
任何递归过程都可以使用迭代重新实现;如果堆栈深度限制是一个问题,只需重新设计您的算法。
-
我不会说这是导致递归 Python 程序崩溃的开销。我认为这是一个有意的设计选择。在导致实际堆栈溢出之前,您可以将maximum recursion depth 提高几个数量级。或者您是在说“即使将递归限制设置得非常高,Python 中的堆栈溢出也比 C 中发生得更快?”?我想这是真的,但是对于大多数建立在 C 之上的语言来说,这可能是真的。
-
我不知道递归函数调用比任何其他函数调用更昂贵,无论是在 Python 中还是在 C 中。
-
如果你出于性能原因用 C 重写它,那你为什么坚持用递归来写呢?编写递归函数的主要原因是它使代码干净、简短且易于阅读。