0

巨大な for ループがネストされています....全部で 10 個ありますが、ここでは説明のために 6 個を含めています。内側の for ループのインデックスは、外側のループのインデックスに依存します (1 つのインスタンスを除く)。最も内側のループには、'&' と '|' を使用してすべて組み合わせた 8 つの異なる条件に基づいて配列 ('w' という名前) をスライスする操作が含まれています。このスライスされた配列 (「wrange」という名前) を引数として取り、それに対していくつかの操作を実行し、同じサイズの配列を返す、この「HB」関数もあります。

このスライスと「HB」関数の実行時間は、それぞれ 300 ~ 400 マイクロ秒と 100 マイクロ秒です。大幅に下げる必要があります。ナノ秒まで.!!

配列の代わりに辞書を使用してみました(スライスしている場所)。それははるかに遅いです。すべての可能な値のスライスされた配列を保存しようとしました。条件の可能な組み合わせは多数あるため、それ自体が非常に巨大な計算になります (これらの条件は for ループのインデックスに間接的に依存します)。

s は 1 から 49 まで

t は -s から s になります

l,nの組み合わせは641通り

ここでは、説明のために s,t の 1 つの値と l,n の組み合わせを掲載しました。

s = 7
t = -7 
l = 72
n = 12
Nl = Dictnorm[n,l]
Gamma_l = Dictfwhm[n,l]
Dictc1 = {}
Dictc2 = {}
Dictwrange = {}
DictH = {}
DictG = {}
product = []
startm = max(-l-t,-l)
endm = min(l-t,l)+1
sum5 = 0
for sp in range(s-2,s+3): #s'
    sum4 = 0
    for tp in range(-sp,-sp+1): #t'
        #print(tp)
        sum3 = 0
        integral = 1
        for lp in range(l-2,l+3): #l'
            sum2 = 0
            if (n,lp) in Dictknl2.keys():
                N1 = Dictnorm[n,lp]
                Gamma_1 = Dictfwhm[n,lp]
                for lpp in range(l-2,l+3): #l"
                    sum1 = 0
                    if ((sp+lpp-lp)%2 == 1 and sp>=abs(lpp-lp) and 
                        lp>=abs(sp-lpp) and lpp>=abs(sp-lp) and 
                        (n,lpp) in Dictknl2.keys()):
                        F = f(lpp,lp,sp)
                        N2 = Dictnorm[n,lpp]
                        Gamma_2 = Dictfwhm[n,lpp]
                        for m in range(startm, endm): #m
                            sum0 = 0
                            L1 = LKD(n,l,m,l,m)
                            L2 = LKD(n,l,m+t,l,m+t)
                            for mp in range(max(m+t-tp-5,m-5), 
                                            min(m+5,m+t-tp+5)+1): #m'
                                if (abs(mp)<=lp and abs(mp)<=lpp and 
                                    abs(mp+tp)<=lp and abs(mp+tp)<=lpp 
                                    and LKD(n,l,m,lp,mp)!=0 
                                    and LKD(n,l,m+t,lpp,mp+tp)!=0):
                                    c3 = Dictomega[n,lp,mp+tp]
                                    c4 = Dictomega[n,lpp,mp]
                                    wrange = np.unique(np.concatenate
                                             ((Dictwrange[m],                                  
                                             w[((w>=(c3-Gamma_1))&
                                             ((c3+Gamma_1)>=w))|
                                             ((w>=(c4-Gamma_2))& 
                                             ((c4+Gamma_2)>=w))])))
                                    factor = (sum(
                                             HB(Dictc1[n,l,m+t],
                                                Dictc2[n,l,m],Nl,
                                                Nl,Gamma_l,
                                                Gamma_l,wrange,
                                                Sigma).conjugate()
                                             *HB(c3,c4,N1,N2,Gamma_1, 
                                              Gamma_2,wrange,0)*L1*L2)
                                             *LKD(n,l,m,lp,mp)
                                             *LKD(n,l,m+t,lpp,mp+tp)                    *DictG[m]
                                             *gamma(lpp,sp,lp,tp,mp)
                                             *F)
                                    sum0 = sum0 + factor #sum over m'
                            sum1 = sum1 + sum0 #sum over m
                    sum2 = sum2 + sum1 #sum over l"
                sum3 = sum3 + sum2 #sum over l'
        sum4 = sum4 + sum3*integral #sum over t' 
    sum5 = sum5 + sum4 #sum over s'
z = (1/(sum(product)))*sum5
print(z.real,z.imag,l,n)

TL;DR

def HB(a,...f,array1): #########timesucker
    perform_some_operations_on_array1_using_a_b_c_d
    return operated_on_array1


for i in ():
    for j in ():
       ...
         ...
          for o in ():
              array1 = w[w>some_function1(i,j,..k) & 
                         w<some_function2(i,j,..k) |.....] #########timesucker
              factor = HB(a,....f,array1) * HB(g,...k,array1) * 
                       alpha*beta*gamma....

このセクション全体を 1 回実行するには、約 30 秒かかります。できるだけ低くする必要があります。1秒が最小目標

4

0 に答える 0