python求二项式系数的几种方法及性能对比

最近研究了python求二项式系数的几种方法,对比了一下他们的速度

1. 利用阶乘简洁求

#普通阶乘
def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)
#普通Cmn
def Cmn(n,m):
    return fact(n)/(fact(n-m)*fact(m))

2. 直接递归求解

def Cnk0(n,k):
    if k==0: return 1
    if n==0: return 0
    return Cnk0(n-1,k)+Cnk0(n-1,k-1)


3. 动态规划求解

(1)带备忘录的

def memo(func):
    cache={}
    @wraps(func)
    def wrap(*args):
        if args not in cache:
            cache[args]=func(*args)
        return cache[args]
    return wrap
@memo
def Cnk(n,k):
    if k==0: return 1
    if n==0: return 0
    return Cnk(n-1,k)+Cnk(n-1,k-1)

(2)迭代求解

def CnkD(n,k):
    C=defaultdict(int)
    for row in range(n+1):
        C[row,0]=1
        for col in range(1,k+1):
            if col <= row:
                C[row,col]=C[row-1,col-1]+C[row-1,col]
    return C[n,k]


速度对比:

n = 100
k = 5
用时(秒):
1: 0.0
2:64.45168709754944
3(1):0.0019998550415039062
3(2):0.0

发现直接递归求解的速度是最慢的,这个容易想见,因为其做了很多重复运算

去掉它,再进一步对比剩下三个的速度

n = 100
k = 80
用时(秒):
1: 0.0
3(1):0.010999917984008789
3(2):0.007001161575317383

n = 500
k = 100
这时发现1,和3(1)都出现了maximum recursion depth exceeded in comparison错误 

这是由于栈深度引起的问题

只有3(2)不存在这个问题仍能计算出结果


你可能感兴趣的:(Python,python,二项式系数,性能)