我目前正在将一些C代码翻译为Python。此代码正用于帮助识别射电天文学中使用的CLEAN算法产生的错误。为了进行这种分析,必须在特定像素值(由ANT_pix给出)中找到强度映射的傅里叶变换的值,Q斯托克斯映射和U斯托克斯映射。这些地图只有257 * 257个阵列。Python中的DFT花费的时间明显长于C
下面的代码需要几秒钟的时间才能用C运行,但需要花费数小时才能运行Python。我非常肯定它的优化非常好,因为我对Python的知识很差。
感谢您提供任何帮助。
更新我的问题是如果有更好的方法来实现Python中的循环,这将加快速度。我已经阅读了很多关于Python的其他问题的答案,如果可能的话,建议避免嵌套for循环,我只是想知道是否有人知道一个好的方式来实现像下面的Python代码没有循环或更好优化的循环。我意识到这可能是一个很高的命令!
我到目前为止一直在使用FFT,但是我的主管想看看DFT会产生什么样的差异。这是因为天线位置通常不会以精确的像素值出现。使用FFT需要四舍五入到最接近的像素值。
我使用Python作为CASA,用来降低射电天文数据集的计算机程序是用Python编写,并在其中执行的Python脚本远比C.
原始代码
def DFT_Vis(ANT_Pix="",IMap="",QMap="",UMap="", NMap="", Nvis=""):
UV=numpy.zeros([Nvis,6])
Offset=(NMap+1)/2
ANT=ANT_Pix+Offset;
i=0
l=0
k=0
SumI=0
SumRL=0
SumLR=0
z=0
RL=QMap+1j*UMap
LR=QMap-1j*UMap
Factor=[math.e**(-2j*math.pi*z/NMap) for z in range(NMap)]
for i in range(Nvis):
X=ANT[i,0]
Y=ANT[i,1]
for l in range(NMap):
for k in range(NMap):
Temp=Factor[int((X*l)%NMap)]*Factor[int((Y*k)%NMap)];
SumI+=IMap[l,k]*Temp
SumRL+=RL[l,k]*Temp
SumLR+=IMap[l,k]*Temp
k=1
UV[i,0]=SumI.real
UV[i,1]=SumI.imag
UV[i,2]=SumRL.real
UV[i,3]=SumRL.imag
UV[i,4]=SumLR.real
UV[i,5]=SumLR.imag
l=1
k=1
SumI=0
SumRL=0
SumLR=0
return(UV)
容易得多
几小时是夸张还是真的需要几个小时才能运行? – 2012-04-08 14:54:26
您能否将您的问题改为一个问题? – 2012-04-08 14:55:25
“下面的代码需要几秒钟才能运行C”。呃,代码是Python代码。我们看不到C代码。但手卷纯Python DFT代码可能会很慢,这应该不会让人感到意外。为什么你认为你应该重新实现这个代码,而不是使用其中一个已经很好的已知库? – 2012-04-08 15:07:07