2015-06-11 74 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