代码运行自无限时间

Code running since infinite time

下面是我的代码。自无限时间(将近一天)以来已经 运行 了。我无法弄清楚是因为有很多循环还是因为有无休止的循环。以下是我的代码:

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() 

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

但是,如果您加入一些打印语句来查看您在各种循环中的位置,您就会明白为什么要花这么长时间。例如,在 for y in range(0, 1023): 行之后,添加一个 print(y) 行,您会看到每次打印输出之间大约需要 1 秒,因此您的部分代码将花费大约 1023 x 1023 秒,这是12天。你可能想研究像 multiprocessing 这样的模块来并行化一些计算,但即使在 32 核机器上,你的代码仍然需要大约半天的时间才能 运行.

您可以进行一些小的优化,我不确定它们的帮助有多大。首先,您可以在内部循环中分别计算 sin(beta)cos(beta) 一次,而不是每次计算 4 次。您可以全局计算 R**2 一次,而不是每次都在内循环中计算。您可以更少地计算 x*0.005y*0.005,以及 al。您可以拆分涉及 lm 的条件,并将 l 条件向上移动到 z 循环之上,从而有时可能避免 z 循环。

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