Skip to main content
 首页 » 编程设计

python之AstroPy SkyCoord 极慢,如何解决

2025年05月04日10zfyouxi

我正在使用 AstroPy SkyCoord 将数百万数据从赤道坐标转换为银河坐标,速度非常慢。任何人都有加快速度的想法,否则运行整个数据集需要很长时间。代码如下:

from astropy import units as u 
from astropy.coordinates import SkyCoord 
import numpy as np 
 
ra1 = np.loadtxt('data.txt',usecols=(0,)) 
dec1 = np.loadtxt('data.txt',usecols=(1,)) 
size = len(ra1) 
for i in range(size): 
    ra = ra1[i] 
    dec = dec1[i] 
    c = SkyCoord(ra*u.degree, dec*u.degree) 
    cc = c.galactic 
    b = cc.b.degree 
    l = cc.l.degree 

请您参考如下方法:

I loop over the whole data, but do the conversion one by one.

不要那样做。从向量的角度思考,就像 numpy 一样。 astropy 中的大多数例程都应按矢量方式使用。

因此:

from astropy import units as u 
from astropy.coordinates import SkyCoord 
import numpy as np 
 
c = SkyCoord(np.array(ra1)*u.degree, np.array(dec1)*u.degree) 
cc = c.galactic 
b = cc.b.degree 
l = cc.l.degree 

并且不要遍历它。

c、cc、b 和 l 都将是数组(尽管有些是 SkyCoord 数组),长度与 ra1 和 dec1 相同。

对于您机器上的 180,000,这应该需要不到一秒的时间来运行。


当您的数据(列表)增长到超过 10,000 或 100,000 个元素时,您几乎不必在 Python 中运行 for 循环。使用 numpy(或此处为 astropy),或者如果没有其他选择,请寻找 Cython 或什至用 C 编写代码。(或使用 PyPi,但会失去很多库兼容性。)

Python 在(大)列表/数组上循环时并不快,而且它从来就不是这样。