import time
def fib_slow(n):
   assert n > 0, "n > 0"
   if n == 1 or n == 2:
       return 1
   return fib_slow(n - 2) + fib_slow(n - 1)
def fib_fast1(n):
   assert n > 0, "n > 0"
   if n == 1 or n == 2:
       return 1
   else:
       a, b = 1, 1
       for _ in range(n - 2):
           a, b = b, a + b
       return b
def fib_gen(n):
   assert n > 0, "n > 0"
   if n == 1 or n == 2:
       yield 1
   else:
       i, a, b = 0, 0, 1
       while i < n:
           a, b = b, a+b
           yield a
           i = i + 1
num = 500000
start_time = time.time()
result = fib_slow(num)
print('result: %d' % result)
end_time = time.time()
print('fib_slow time used: %d' % (end_time-start_time))
start_time = time.clock()
result = fib_fast1(num)
print('result: %d' % result)
end_time = time.clock()
print('fib_fast1 time used: %f' % (end_time - start_time))
start_time = time.clock()
for index, fib_number in enumerate(fib_gen(num)):
   if index == num-1:
       print(fib_number)
end_time = time.clock()
print('\nfib_gen time used: %f' % (end_time-start_time))
运行的结果如下:
result: 102334155
fib_slow time used: 45
result: 102334155
fib_fast1 time used: 0.000038
第一种递归的方式重复了大量计算,仅仅是计算第40个数就已经用了45秒
第二种递推的方式在数字为50万的时候,时间达到了3秒
num = 500000
result: 29555614082695151...
fib_fast1 time used: 3
第三种写成了生成器,可以返回所有的fib值
num = 500000
fib_gen time used: 4.244906