For loop 如何使用“优化”优化我的代码;For Loop";?

For loop 如何使用“优化”优化我的代码;For Loop";?,for-loop,optimization,time,parallel-processing,wolfram-mathematica,For Loop,Optimization,Time,Parallel Processing,Wolfram Mathematica,我正试图开发一个计算材料中电子局域态密度的代码。为此,我使用了多个For循环和多个表。完成需要45秒,我需要的时间更少。任何关于如何优化此代码的建议 AbsoluteTiming[Ns=2; \[Eta] = 0.001; Nx=15; Ny=15; NN=Nx*Ny; Nband=8; kkmx = Ns*Nx; kkmy = Ns*Ny; wmax = 0.2; nw = 800; p = 0; Print["starting ldos calc"]; nsite = 2; ldo

我正试图开发一个计算材料中电子局域态密度的代码。为此,我使用了多个For循环和多个表。完成需要45秒,我需要的时间更少。任何关于如何优化此代码的建议

AbsoluteTiming[Ns=2; \[Eta] = 0.001;
Nx=15;
Ny=15;
NN=Nx*Ny;
Nband=8; 
kkmx = Ns*Nx; 
kkmy = Ns*Ny; 
wmax = 0.2; nw = 800; p = 0; 
Print["starting ldos calc"];
nsite = 2; 
ldos  = 0; 

For[kx = 0, kx <= (Ns - 1.)*2*(Pi/kkmx), kx += 2*(Pi/kkmx),
For[ky = 0, ky <= (Ns - 1.)*2*(Pi/kkmy), ky += 2*(Pi/kkmy),
ES = Eigensystem[H];
elist = Table[ES[[1,l]], {l, 1, Nband/2*4*NN}];
 ulist = Table[Abs[ES[[2,l,i]]]^2, {l, 1, Nband/2*4*NN}, {i, 388+1, 388+(nsite - 1)*Nband/2 + Nband/2}]; 
   vlist = Table[Abs[ES[[2,l,i + Nband/2*NN*2]]]^2, {l, 1, Nband/2*4*NN}, {i, 388+1, 388+(nsite - 1)*Nband/2 + Nband/2}]; 

   ldossc = Table[Im[Total[Table[ulist[[l,1 ;; All]]*(1/(-wmax + wmax*2*(w/nw) - elist[[l]] + I*\[Eta])) + 
   vlist[[l,1 ;; All]]*(1/(-wmax + 2*wmax*(w/nw) + elist[[l]] + I*\[Eta])), {l, 1, Nband/2*4*NN}]]], {w, 0, nw}]; ldos = ldos + ldossc; 

   Export["ldosorb_up_P.dat", Table[{-wmax + wmax*2*(\[Omega]/nw), (-Pi^(-1))*(ldos[[\[Omega] + 1,i]]/Ns^2)}, {\[Omega], 0, nw}, {i, 1,8}]]; 
  (* Export["ldostot.dat", Table[{-wmax + wmax*2*(\[Omega]/nw), (-Pi^(-1))*((ldos[[\[Omega] + 1,i]] + ldos[[\[Omega] + 1,i + 1]] + ldos[[\[Omega] + 1,i + 2]] + ldos[[\[Omega] + 1,i + 3]] + ldos[[\[Omega] + 1,i + 4]])/Ns^2)}, {\[Omega], 0, nw}, {i, 1, (nsite - 1)*Nband/2 + Nband/2 - 4}]]; *)
   Print["kx=", kx, "   ky=", ky, "  nsx=", (kx/(2*Pi))*kkmx + 1.]; ]; ]; ]```
绝对定时[Ns=2;\[Eta]=0.001;
Nx=15;
Ny=15;
NN=Nx*Ny;
Nband=8;
kkmx=Ns*Nx;
kkmy=Ns*Ny;
wmax=0.2;nw=800;p=0;
打印[“启动ldos计算”];
nsite=2;
ldos=0;

对于[kx=0,kx,而Mathematica的内置函数使用了过多的For循环(事实上据我所知,
Do
通常更快)和/或表通常不会产生最佳性能。您应该考虑编译器语言,或者至少告诉Mathematica编译它,然后运行本机函数。例如:在尝试对代码进行任何优化之前,您应该尝试找出什么是慢的。在这种情况下,我假设调用<代码。>仅在双循环中,本征系统
和导出将占总运行时间的很大一部分。我建议验证这一点。只有当您知道什么是真正的慢时,优化才有意义。
H
的定义是什么?