2017-02-10 5 views
1

よりもはるかに遅いのはなぜ更新私のPythonコードはRコード

最後に、私は間違いを見つけた...バグは私の完全なコードです。私はpyの初心者ですので、... 1つのエラーを指摘する@mrdomobotoに感謝します。ありがとう@Spacedman私は私の完全なコードを見に戻って行くことができるように、再現可能な例を作成することができます。

私の騒音で申し訳ありません...私はより慎重に私のコードをチェックしてから質問します。私はそれを削除する必要がありますか?

私はパーセプトロンアルゴリズムに関するいくつかの実験を行っています。この練習では、Pythonを学ぼうとしています。だから私はRとPythonで両方を実装しました。しかし、私は私のPythonコードが私のRコードより約10倍遅いことがわかりました。実際には、私はほとんど私のRコードをPythonに直接変換します。私は本当に理由を知りたい。私の悪いコードから問題を指摘してください。

Rコード:

perceptron <- function(X,y,ini=c(0,0,0)){ 
    w <- ini 
    N <- length(y) 
    continue <- T 
    while(continue){ 
    cont <- 0 
    for(i in 1:N){ 
     if(sign(sum(X[i,]*w)*y[i])==1){cont <- cont+1} 
     else{w <- w + y[i]*X[i,]} 
    } 
    if(cont==N){continue <- F} 
    } 
    return(w) 
} 

マイPYコード:アルゴリズムの最も内側のループの内部

def Perceptron(X,y,ini=(0,0,0)): 
    w = np.array(ini) 
    N = X.shape[0] 
    # add ones as the first columns of X 
    X = np.hstack((np.ones(N).reshape(N,1), X)) 
    go_next = True 
    while go_next: 
     cont = 0 
     for i in range(N): 
      if np.sign(X[i,:].dot(w)*y[i]) == 1: 
       cont = cont + 1 
      else: w = w + y[i]*X[i,:] 
      if cont==N: go_next=False 
    return w 
+1

私は両方のプログラム([profiling in R](https://www.r-bloggers.com/profiling-r-code/)、[profiling in Python](http://stackoverflow.com)をプロファイルすることをお勧めします。/questions/582336/how-can-you-profile-a-script)を参照してください)。これにより、コードのどの部分が最も長くなるかについての洞察が得られます。コードが非常に似ているので、これはPythonでどの部分が長くかかるかの洞察をもたらすかもしれません。 –

+0

この行を削除して 'go_next = True'を実行して' while True'ループを実行し、 'cont == N:go_next = False'を' cont == N:break'に変更すると、数ミリ秒quicker – WhatsThePoint

+0

もし 'cont == N:go_next = False'がPythonコードの' for'ループの範囲内になければならないのですか? Rプログラムにはありません。 – ospahiu

答えて

2

任意の計算は、それらが外側の内部にあった場合よりも大きい大きさの順にプログラムを遅くします最も近いレキシカルスコープ。 (それはあなたのRプログラムであるよう

if cont==N: go_next=Falseは、最も内側のforループの外に移動する必要があります。

computational analysisをご覧ください。

+0

こんにちは@mrdomoboto、多くのありがとう!しかし、これはPythonコードがRよりも10倍高速になる理由ではありません。私のフルコードにはいくつかのエラーがあります。 – ANuo

関連する問題