我正在使用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
答案 0 :(得分:11)
我循环遍历整个数据,但逐个进行转换。
不要那样做。想象矢量,就像numpy一样。星座中的大多数例程都是以矢量方式使用的。
因此:
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
数组),长度与{{1}相同}和ra1
。
对于您机器上的180,000,运行时间不到一秒。
当您的数据(列表)增长到超过10,000或100,000个元素时,您几乎不必在Python 中运行for循环。使用numpy(或astropy here),或者如果没有其他选项,请寻找Cython甚至用C语言编写代码。(或者使用PyPi,但这会失去很多库兼容性。)
在循环(大)列表/数组时,Python并不快,而且它从来就不是。