代码运行自无限时间
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.005
和 y*0.005
,以及 a
和 l
。您可以拆分涉及 l
和 m
的条件,并将 l
条件向上移动到 z
循环之上,从而有时可能避免 z
循环。
此外,您的 beta
范围从 0 到 359,然后计算其 sin
和 cos
值,这似乎很奇怪。这些函数期望以弧度为单位的参数,例如直角的正弦不是 sin(90)
而是 sin(math.pi/2)
.
下面是我的代码。自无限时间(将近一天)以来已经 运行 了。我无法弄清楚是因为有很多循环还是因为有无休止的循环。以下是我的代码:
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.005
和 y*0.005
,以及 a
和 l
。您可以拆分涉及 l
和 m
的条件,并将 l
条件向上移动到 z
循环之上,从而有时可能避免 z
循环。
此外,您的 beta
范围从 0 到 359,然后计算其 sin
和 cos
值,这似乎很奇怪。这些函数期望以弧度为单位的参数,例如直角的正弦不是 sin(90)
而是 sin(math.pi/2)
.