2014-09-02 2 views
0

Я следующий код, который я пытаюсь ускорить:Как ускорить вложенный для петель питона

for alpha in range(-N,N+1): 
    for beta in range(-N,N+1): 
     I1 = (alpha+N)+(beta+N)*(2*N+1) 
     for gamma in range(-N,N+1): 
      for delta in range(-N,N+1): 
       if alpha!=gamma or beta!=delta: 
        J1 = (gamma+N)+(delta+N)*(2*N+1) 
        temp1 = 0; 
        for nn in range(0,numphases-1): 
         R = pi*(sqrt((a[nn+1]*(alpha-gamma)/a[0])**2+((b[nn+1]*(beta-delta)/b[0])**2))) 
         temp1 += (f[nn+1,mm]-f[nn,mm])*(pi/2)*((a[nn+1]*b[nn+1]))*(fp.besselj(1,R[0,0]))/R[0,0] 
        Lambda[I1,J1,mm] = temp1[0,0] 

для значений N равно> 1.

Я посмотрел на многих примерах распараллеливать его и векторизовать его, но я все еще не уверен, что могу сделать, чтобы ускорить его.

Любая помощь была бы принята с благодарностью!

+3

Проверьте [обзорный сайт кода] (http://codereview.stackexchange.com/). Кроме того, я не знаю, что делает ваш код. Трудно читать. –

+2

Вы на python2.x или python3.x? На python2.x вы можете использовать 'xrange' и получать некоторые ускорения там. В противном случае вы, вероятно, захотите перейти к чему-то вроде «numpy». – mgilson

+3

Возможно, вы могли бы описать, что должен делать этот алгоритм O (n ** 5) (!). – roippi

ответ

0

Один из способов приближения к этим типам циклов - использование многожильных и многомерных массивов и попытка векторизации вычислений. Каждый цикл соответствует другому размеру массива numpy. Вы бы начать с самого внутреннего цикла, и вы могли бы написать что-то вроде:

Lambda[I1,J1,mm] = sum(f[1:,mm]-[f[0:-1,mm]*pi/2+a[1:]*b[1:]*fp.besselj(1,R)/R 

Вы бы затем двигаться наружу EAC время, добавив еще одно измерение. Но это очень сложно, и может не всегда работать. В этом случае, например, Я не мог понять, как использовать R как функцию Бесселя, так и в номинаторе.

Более простой подход состоит в том, чтобы переписать вычисления, по крайней мере, внутренние петли на C или C++ либо изначально, либо с помощью различных библиотек связывания, а затем просто вызвать подпрограмму из Python.

+0

Cython работал, спасибо! –

Смежные вопросы