代码运行无限时间

Pra*_*ari -1 python python-2.x python-2.6 python-2.5 python-2.7

以下是我的代码.它从无限时间(几乎一天)开始运行.我无法弄清楚是不是因为有很多循环或因为有无限循环.以下是我的代码:

mat1 = np.zeros((1024,1024,360),dtype=np.int32)

k = 498
gamma = 0.00774267
R = 0.37
g = np.zeros(1024)
g[0:512] = np.linspace(0,1,512)
g[513:] = np.linspace(1,0,511)
pf = np.zeros((1024,1024,360))
pf1 = np.zeros((1024,1024,360))

for b in range(0,1023) :
  for beta in range(0,359) :
    for a in range(0,1023) :
      pf[a,b,beta] = (R/(((R**2)+(a**2)+(b**2))**0.5))*mat[a,b,beta]
    pf1[:,b,beta] = np.convolve(pf[:,b,beta],g,'same')

for x in range(0,1023) :
  for y in range(0,1023) :
    for z in range(0,359) :
        for beta in range(0,359) :
          a = R*((-x*0.005)*(sin(beta)) + (y*0.005)*(cos(beta)))/(R+(x*0.005)*(cos(beta))+(y*0.005)*(sin(beta)))
          b = z*R/(R+(x*0.005)*(cos(beta))+(y*0.005)*(sin(beta)))
          U = R+(x*0.005)*(cos(beta))+(y*0.005)*(sin(beta))
          l = math.trunc(a)
          m = math.trunc(b)
          if (0<=l<1024 and 0<=m<1024) : 
              mat1[x,y,z] = mat[x,y,z] + (R**2/U**2)**pf1[l,m,beta]

import matplotlib.pyplot as plt
from skimage.transform import iradon
import matplotlib.cm as cm
from PIL import Image
I8 = (((mat1 - mat1.min()) / (mat1.max() - mat1.min())) *   255.9).astype(np.uint8)
img = Image.fromarray(I8)
img.save("M4.png")
im = Image.open("M4.png")
im.show() 
Run Code Online (Sandbox Code Playgroud)

Ami*_*pta 5

您的代码将在有限的时间内运行.

但是,如果你在几个打印语句中看到你在各种循环中的位置,你可以看到它为什么需要这么长时间.例如,在该for y in range(0, 1023):行之后添加print(y)一行,您将看到每个打印输出之间大约需要1秒,因此您的部分代码大约需要1023 x 1023秒,即12天.您可能希望查看类似于multiprocessing并行化某些计算的模块,但即使在32核计算机上,您的代码仍然需要大约半天才能运行.

你可以做几个小优化,我不确定它们会有多大帮助.首先,你可以计算sin(beta)和cos(beta)各一次,每次在内部循环,而不是4倍.您可以R**2全局计算一次,而不是每次在内循环内计算.你可以计算,x*0.005而y*0.005不是经常,以及a和l.您可以拆分条件涉及l和m,并将l条件移到z循环之上,从而z有时可能避免该循环.

此外,您的beta范围从0到359,然后计算其值sin和cos值似乎很奇怪.这些函数期望以弧度为单位的参数,例如直角的正弦sin(90)不是sin(math.pi/2).