2015-11-03 54 views
-1

以下是我的代码。自无限时间(几乎一天)开始运行。我无法弄清楚是因为有很多循环还是因为有无止境的循环。以下是我的代码:自无限时间运行代码

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

欢迎来到暂停问题。也许你可以添加一些日志记录并确定程序在哪里花费时间。 – jgritty

+0

如果在循环内添加日志记录(打印迭代器)以跟踪正在进行的进程,会发生什么情况?那将是我的第一步。 – 0x24a537r9

+3

几乎一天不是无限的。 –

回答

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.005y*0.005,以及al。您可以拆分条件涉及lm,并将l有条件地移到z循环之上,因此有时可能会避免该循环。

此外,看起来很奇怪,你的beta范围从0到359,然后计算它的sincos值。这些函数需要弧度参数,例如直角的正弦不是sin(90)而是sin(math.pi/2)