2015-06-11 77 views
-2

我一直在寻找在柯尔莫哥洛夫斯米尔诺夫测试的scipy.stats实施,看见下面的代码:Python代码范例优化

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

这个问题*力量*是一个更适合于[代码审查(http://codereview.stackexchange.com /) – That1Guy

回答

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 
+0

在第二个分支中,如果第二个if条件满足,相同的调用会执行两次? – gt6989b