【问题标题】:AstroPy SkyCoord extremely slow, how to resovle it?AstroPy SkyCoord 速度极慢,如何解决?
【发布时间】:2016-07-08 20:32:21
【问题描述】:

我正在使用 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

【问题讨论】:

  • “极慢”有多慢?请量化数据量和所需时间。如果radec 是您的输入数组,这可能是您能获得的最快速度(除非您围绕它编写一些多处理代码)。
  • @Evert 运行 180,000 条数据大约需要一个小时。但我有超过500万。我不明白为什么转换需要这么长时间才能运行。
  • 我可以用len(c) == 10000000 很好地运行它。您可能会遇到机器的内存限制并进行大量交换。虽然180,000真的很低。你机器的内存限制是多少?
  • 您忘记在示例中显示循环;那误导了我。只要确保你有一个完整的例子。
  • 请出示您的完整代码。

标签: python coordinates data-conversion astropy


【解决方案1】:

我循环遍历整个数据,但逐个进行转换。

不要那样做。像 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

并且不要循环它。

cccbl 都将是数组(尽管有些是 SkyCoord 数组),长度与 ra1dec1 相同。

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


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

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

【讨论】:

  • 效果很好。我不知道这个例程是为了使用向量而设计的,否则我将使用 numpy 数组。非常感谢。
  • 很遗憾,天体坐标文档中没有提到它,但在SkyCoord class 的更详细概述中只提到了一半。也许应该在引言中更多地提出这一点。
  • 对于它的价值,如果您的示例中的 ra1dec1 还不是数组,我认为使用 u.Quantity('ra1', 'degree') 等将它们显式转换为数量会更清晰、更清晰。但是那只是我。
  • 这么简单,谢谢。我不知道SkyCoord 也打算用于矢量。通常我不认为以这种方式创建对象。我刚刚将我的代码(创建了一个 SkyCoord 对象 700,000 次,并进行了一些计算)从 11 小时(估计)加快到了 43 秒.... -_-
  • @jphollowed 在等待结果的过程中,您现在不能再喝很多咖啡了。 (顺便说一下,这种数组样式适用于 Astropy 中的大多数内容,例如 Time 也是如此。)
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 2015-02-07
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多