四种方法实现斐波那契数列的对比
# 以下四种方法中,速度最慢的是第一种递归方法但代码最简洁; # 最好的方法依次是:第三种方法生成器,第二、三种方法 # 1.递归法:写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000 def fib1(n): assert n >= 0, "n > 0" if n <= 1: return n return fib1(n - 1) + fib1(n - 2) # 2.递推法:递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢 def fib2(n): a, b = 0, 1 for _ in range(n+1): a, b = b, a+b return a # print(fib2(1000000)) # 3.生成器:带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素 def fib3(n): a, b = 0, 1 while n > 0: a, b = b, a + b n -= 1 yield a i = 0 for i in fib3(1000001): pass print(i, end=' ') # 4.矩阵 # 4.1 import numpy def fib41(n): res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]]) return res[0][0] # for i in range(10): # print(int(fib41(i)), end=' ') # 4.2使用矩阵计算斐波那契数列: def _f(n): Matrix = numpy.matrix("1 1;1 0") # 返回是matrix类型 return pow(Matrix, n) # pow函数速度快于 使用双星好 ** def fib42(n): result_list = [] for i in range(0, n): result_list.append(numpy.array(_f(i))[0][0]) return result_list # print(fib42(1000000)) # 因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n) # 用科学计算包numpy来实现矩阵法 O(log n)
计算部分代码或函数平均执行时间:timeit
import timeit print(timeit.timeit("fib4(1000000)", setup="from __main__ import fib4", number=1))
posted on 2018-01-25 18:16 myworldworld 阅读(206) 评论(0) 收藏 举报