我正试图用Python和astropy.io从FITS文件的二进制表中提取数据。该表包含一个有超过200万个事件的事件数组。我想做的是将某些事件的时间值存储在一个数组中,这样我就可以对该数组进行分析。我遇到的问题是,在fortran中(使用FITSIO),同样的操作在一个慢得多的处理器上可能只需要几秒钟,而在Python中使用astropy.io进行完全相同的操作却需要几分钟。我想知道瓶颈到底在哪里,是否有更有效的方法来访问各个元素,以确定是否将每个时间值存储在新数组中。以下是我到目前为止的代码。
from astropy.io import fits
minenergy=0.3
maxenergy=0.4
xcen=20000
ycen=20000
radius=50
datafile=fits.open('datafile.fits')
events=datafile['EVENTS'].data
datafile.close()
times=[]
for i in range(len(events)):
energy=events['PI'][i]
if energy<maxenergy*1000:
if energy>minenergy*1000:
x=events['X'][i]
y=events['Y'][i]
radius2=(x-xcen)*(x-xcen)+(y-ycen)*(y-ycen)
if radius2<=radius*radius:
times.append(events['TIME'][i])
print times
希望得到任何帮助。我在其他语言中是个不错的程序员,但我以前还没有真正担心过Python的效率问题。我现在选择用Python做这件事的原因是,我在FITSIO和PGPLOT中都使用了fortran,还有一些来自Numerical Recipes的程序,但是我在这台机器上使用的新的fortran编译器不能被说服来产生一个正常工作的程序(有一些32位与64位的问题,等等)。Python似乎有我需要的所有功能(FITS I/O、绘图等),但如果访问一个列表中的单个元素要花很长时间,我将不得不找到另一个解决方案。
非常感谢。