Python 从无限时间开始运行的代码

Python 从无限时间开始运行的代码,python,python-2.7,python-2.6,python-2.x,python-2.5,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

下面是我的代码。它从无限期(几乎一天)开始运行。我不知道这是因为有很多循环,还是因为有无止境的循环。以下是我的代码:

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() 
mat1=np.zero((10241024360),dtype=np.int32)
k=498
伽马=0.00774267
R=0.37
g=np.0(1024)
g[0:512]=np.linspace(0,1512)
g[513:=np.linspace(1,0511)
pf=np.零((10241024360))
pf1=np.零((10241024360))
对于范围(01023)内的b:
对于范围内的beta(0359):
对于范围(01023)内的a:
pf[a,b,beta]=(R/((R**2)+(a**2)+(b**2))**0.5))*mat[a,b,beta]
pf1[:,b,beta]=np.卷积(pf[:,b,beta],g,'same')
对于范围(01023)内的x:
对于范围(01023)内的y:
对于范围(0359)内的z:
对于范围内的beta(0359):
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=数学真值(b)

如果(0您的代码将在有限时间内运行。

但是,如果您加入一些print语句来查看您在各个循环中的位置,您可以看到为什么需要这么长时间。例如,在范围(01023)中y的
行之后,添加一个
print(y)
line,您将看到每次打印之间大约需要1秒的时间,因此部分代码大约需要1023 x 1023秒,即12天。您可能希望查看类似于
多处理的模块以并行化一些计算,但即使在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)

欢迎讨论暂停问题。也许您可以添加一些日志记录并确定程序在何处花费时间。如果添加日志记录(打印迭代器),会发生什么情况在循环内部跟踪正在进行的进度?这将是我的第一步。几乎一天不是无限的。我尝试打印“pf”,它在每次迭代中不断给出值。但这本身非常慢。因此我猜下一个循环将花费更多的时间。它已经运行了一天,仍然在运行,没有任何错误或结果,我已经完成了不知道它什么时候会停止运行。而且是无限的。