2016-10-12 15 views
0

このコードをどのように高速化できますか?Pythonでネストされたループを高速化する

while (norm_corr > corr_len): 

    correlation = 0.0 

    for i in xrange(6): 
     for j in xrange(6): 
      correlation += (p[i] * T_n[j][i]) * ((F[j] - Fbar) * (F[i] - Fbar))  

    Integral += correlation 
    T_n =np.mat(T_n) * np.mat(TT) 
    T_n = T_n.tolist() 
    norm_corr = correlation/variance 

ここで、TTは固定された6×6行列であり、pは固定された1×6行列であり、Fは固定された1×6行列である。 T_nはTTのn乗である。

このwhileループは10^4回繰り返されることがあります。

+1

numpy行列の代わりに 'T_n'をリストのリストにしたい理由はありますか? – SethMMorton

+0

TT、p、F、T_nのサンプルデータをご提供ください。これは簡単にテストできる実例です(もちろん、私たち自身のランダムな行列を作ることができますが、あなたのコードはコピー&ペースト実行可能です(あなたもインポートを含んでいれば...)。 – MichaelA

+0

[コードレビュー](http://codereview.stackexchange.com/) – Wondercricket

答えて

0

これらのことをすばやく行うには、Numpyの組み込み関数と演算子を使用して操作を実行します。 Numpyは内部的に最適化されたCコードで実装されており、適切に計算を設定すると、はるかに高速に実行されます。

しかし、Numpyを効果的に活用することは、時には面倒なこともあります。これはコードを「ベクトル化」することです。明示的なループではなく、全体の配列に作用する方法で表現する方法を理解しなければなりません。私見は、ベクトル×行列の乗算を行うことができる。例えば

あなたのループの中であなたがp[i] * T_n[j][i]を持っている、:vは1×6であり、mである場合には、6x6のですその後、v.dot(m)mの列を持つvの内積を計算し1×6です。必要に応じて、さまざまな次元で作業するために、転置や変形を使用できます。

+0

提案していただきありがとうございます。 list comprehensions、numpy.einsumのようなコード行を使用していましたが、ネストされたループはどちらの方法よりも高速でした。 – Ali

関連する問題