代码运行无限时间

时间:2015-11-03 07:10:34

标签: python python-2.7 python-2.6 python-2.x python-2.5

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

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 个答案:

答案 0 :(得分: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.005a,以及ll。您可以拆分涉及ml的条件,并将z条件移到z循环之上,从而可能有时避免beta循环。

此外,您sin的范围从0到359,然后计算其cossin(90)值似乎很奇怪。这些函数期望以弧度为单位的参数,例如直角的正弦不是sin(math.pi/2)而是SELECT tbl_A.mID, tbl_A.data, tbl_B.data, tbl_C.data FROM ((tbl_A LEFT JOIN tbl_B ON tbl_A.mID = tbl_B.mID) LEFT JOIN tbl_C ON tbl_A.mID = tbl_C.mID) WHERE mID = 1 ORDER BY tbl_A.mID