2016-05-28 2 views
0

私は現在、何かを構築するのに理想的な角度値をテストするプログラムを開発中です。今、私は、ネストされたforループについています。理想的には「a」を9000まで数えますが、値が以下のように設定されていれば、ほとんど永遠にかかることになります。このネストされたループをスピードアップする方法はありますか?または、私は何とかresourceをより多くのPythonに割り当てることができますか?Pythonネストループ速度の問題

for a1 in xrange(15, 91): 
    for a2 in xrange(15, 91): 
     for a3 in xrange(15, 91): 
      for a4 in xrange(15, 91): 
       for a5 in xrange(15, 91): 
        for ite in xrange(1, 1000): 
         ok = mathmatvec(a1, a2, a3, a4, a5, ite) 
         if ok == 1: 
           v[0] = a1 
           v[1] = a2 
           . 
           . 
+2

'76 * 76 * 76 * 76 * 76 * 999' =' 2532989850624' = ** 2.5兆**の組み合わせをすべて確認する必要がありますか?実行する操作が何もできなくても(最後のステートメントボディを「パス」に置き換える)、それは「ほぼ永遠」になります。 –

+1

mathmatvec()は何をしますか?その関数の時間複雑さ? –

+0

複数のベクトル乗算と行列乗算を計算します。単独で一度だけ使用された場合、それは注目すべき時間を要しません。もう少し詳しくは、Rory Daultonへの私の返答を参照してください。 – Rugir

答えて

1

itertools.product()関数はネストされたforループを大幅に高速化します。

しかし、実行時間は、の呼び出しの総数によって支配される可能性が高いと、mathmatvec()

0

forループをwhileループに変換しようとする可能性があり、後者がイテレータを作成しないため、高速にする必要があります。だから、代わりに:

for a1 in xrange(15, 91): 

書き込み:

a1 = 15 
while a1 < 91: 
    ... 
    a1 += 1 

またはPyPyを使用するようにしてください。

0

解決方法:別のアルゴリズムを使用してください。

今のように、最も内側のループ999 *(76 ** 5)== 2,532,989,850,624回実行します。最も内側のループ計算が簡単でない限り、これはおそらく多すぎます。

あなたは、「何かを構築するために理想的な角度値をテストしたい」と言います。 「理想」とは何かを正式化できる場合は、最適化アルゴリズムを使用して、必要なものをゼロにすることができます。あなたが探しているものの詳細を私たちに伝えたら、Pythonのより良いルーチンやアルゴリズムについて教えてくれるかもしれません。


私が正しくあなたを理解していれば、mathmatvec()のみが値0および1を取り、あなたが1とiteからmathmatvec(a1, a2, a3, a4, ite)を等しくする1 <= ite <= 999ため15 <= a1 <= 90などのためa1,a2,a3,a4の値とiteを見つけたいが小さいほど可能。

あなたが次にfunc()mathmatvec() == 0のための正の数とmathmatvec() == 1のための負の1を返し

def func(a1, a2, a3, a4, ite): 
    return ite - 1000 * mathmatvec(a1, a2, a3, a4, ite) 

機能を使用して、この多次元最小化問題を作ることができ、かつiteが最小化されたときに負の値が最小化されています。

あなたの関数mathmatvec()がどのように「スムーズ」で、どのように接続されていて、フィットネスの状況によっては、scipy.optimizeの最小化ルーチンの1つで問題を十分に解決できます。 scipy.optimize.differential_evolution() functionは特に興味深いようです。

+0

私はmathmatvecの数式を簡単な言葉にすることはできませんが、5つの角度、最小のiteに達することができます(ite値は数式では0.0001です)ので、可能な角度組み合わせを確認することでした(機能の結果の)最小値が見つかる場合は、範囲(15〜90度の範囲)を指定します。 – Rugir

+0

"ite"の意味を理解できません。しかし、変数a1、a2、a3、a4、a5、iteの値を探していますか?これは、関数mathmatvec()の最小有効な結果を示していますか?もしそうなら、どのような種類の値が返され、どの範囲で返されますか? 「無効な」機能結果とは何ですか?多次元ミニマイザーが必要なように聞こえます。より詳細な確認や拒否が可能です。 –

+0

** a1-5 **と** ite **は、特定の範囲内の値になる必要がある1つの大きな数式の一部です。そうであれば、結果は「有効」で、私は** 1 **を返し、そうでなければ** 0 **を返します。しかし、私が必要とする最終的な結果は、** a1-5 **の任意の星座のための最小** ite **です。だから、すべての条件が満たされて** ite **が小さくなると、それまでのコンステレーションがどのような結果になったのか、私はすべての現在の値を保存します。 – Rugir

関連する問題