以下是我的代码。它从无限时间(几乎一天)开始运行。我无法弄清楚是不是因为有很多循环或因为有无限循环。以下是我的代码:
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()
答案 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.005
和a
,以及l
和l
。您可以拆分涉及m
和l
的条件,并将z
条件移到z
循环之上,从而可能有时避免beta
循环。
此外,您sin
的范围从0到359,然后计算其cos
和sin(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
。