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

时间:2019-02-23 12:39:01

标签: python python-3.x algorithm loops recursion

我比较了循环和递归的运行时间,发现循环速度更快,同时没有遇到RecursionError的问题。为什么会这样,循环这么快?

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次)

def factorial2(n):
   r = 0
   for i in range(n+1):
      r += i
   return r

%%timeit -n1000 -r10000
factorial2(1000)

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

谢谢,祝您编程愉快!

1 个答案:

答案 0 :(得分:1)

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

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