Python 3:为什么循环比递归更快?

Python 3:为什么循环比递归更快?,python,python-3.x,algorithm,loops,recursion,Python,Python 3.x,Algorithm,Loops,Recursion,我比较了循环和递归的运行时,发现循环要快得多,同时没有遇到递归错误的问题。为什么循环要快得多 def factorial(n): if n == 0: return n else: return n + factorial(n-1) %%timeit -n1000 -r10000 factorial(1000) 每个回路163µs±13.2µs(10000次运行的平均±标准偏差,每个1000个回路) 最慢的跑步比最快的跑长9.46倍。这可能意味着正在缓存中

我比较了循环和递归的运行时,发现循环要快得多,同时没有遇到递归错误的问题。为什么循环要快得多

def factorial(n):
   if n == 0:
      return n
   else:
      return n + factorial(n-1)

%%timeit -n1000 -r10000
factorial(1000)
每个回路163µs±13.2µs(10000次运行的平均±标准偏差,每个1000个回路)

最慢的跑步比最快的跑长9.46倍。这可能意味着正在缓存中间结果。 每个回路58.7µs±25.2µs(10000次运行的平均±标准偏差,每个1000个回路)


谢谢,快乐编码

一般来说,除非编程语言专门用于支持快速递归,否则递归总是比较慢。当程序进行函数调用时,将创建一个新的堆栈帧,其中存储了所有局部变量和其他内容。在迭代过程中,所有事情都发生在单个堆栈框架内


有一种称为“尾部递归”的方法,其中函数的编写方式使得计算结果在最后一帧中始终可用-因此理论上,只有一个堆栈帧就足够了。在某些语言中,编译器认识到这种情况,并将递归转换为“幕后”迭代——这种类型的递归确实与迭代一样快。不幸的是,Python3不支持尾部递归。

对于递归,运行时通常需要做额外的工作,将变量推送到堆栈帧,然后进行函数调用,从而增加执行时间。使用递归,即使您反复调用同一个函数,每次调用都会创建所有局部变量的新范围。随着迭代的进行,需要做更多的工作。在Python中,
factorial
实际上是在计算
0->n
btwFunction调用之间的和,这是非常昂贵的。一个误区是for循环在Python中速度很慢,但如果循环包含函数调用甚至方法调用,则大多数情况下都是如此。见和。因此
r+=i
比调用
n+阶乘(n-1)
要快得多。顺便说一句,阶乘不应该使用乘法吗?
def factorial2(n):
   r = 0
   for i in range(n+1):
      r += i
   return r

%%timeit -n1000 -r10000
factorial2(1000)