Python代码示例优化

时间:2015-06-11 19:57:22

标签: python scipy

我正在scipy.stats查看Kolmogorov Smirnov测试的实现,并看到以下代码:

D = np.max([Dplus,Dmin])
if mode == 'asymp':
    return D, distributions.kstwobign.sf(D*np.sqrt(N))
if mode == 'approx':
    pval_two = distributions.kstwobign.sf(D*np.sqrt(N))
    if N > 2666 or pval_two > 0.80 - N*0.3/1000.0 :
        return D, distributions.kstwobign.sf(D*np.sqrt(N))
    else:
        return D, distributions.ksone.sf(D,N)*2

我认为最好这样做:

D = np.max([Dplus,Dmin])
pval_two = distributions.kstwobign.sf(D*np.sqrt(N))
if mode == 'asymp':
    return D, pval_two
if mode == 'approx':
    if N > 2666 or pval_two > 0.80 - N*0.3/1000.0 :
        return D, pval_two
    else:
        return D, distributions.ksone.sf(D,N)*2

我的实现确实可以保存对昂贵的分发生存功能的调用,我觉得它也更清晰了......

但我不是Python专家,scipy是一个经过深思熟虑的库(或者至少对我来说似乎是这样)。那么请你解释一下为什么图书馆会以第一种方式做到这一点?

1 个答案:

答案 0 :(得分:1)

  

我的实现确实保存了对昂贵的分发生存函数的调用,我觉得它也更清晰了

不,它没有。 distributions.kstwobign.sf(D*np.sqrt(N))只被称为一次。看看三个可能的分支。它只会在任何给定的分支中执行一次。

if mode == 'asymp':
    return D, distributions.kstwobign.sf(D*np.sqrt(N))

if mode == 'approx':
    pval_two = distributions.kstwobign.sf(D*np.sqrt(N))
    if N > 2666 or pval_two > 0.80 - N*0.3/1000.0 :
        return D, distributions.kstwobign.sf(D*np.sqrt(N))

if mode == 'approx':
    pval_two = distributions.kstwobign.sf(D*np.sqrt(N))
    # not the previous if case
    else:
        return D, distributions.ksone.sf(D,N)*2