我正在使用 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 在(大)列表/数组上循环时并不快,而且它从来就不是这样。
