是否可以使用 numba 加速基于 xarray 的代码?

Is it possible to speed up xarray-based code with numba?

我有一个大量使用 xarray 包的代码库。计算(逐点算术、点积和内置 numpy ufuncs 大多数)已经高度矢量化。我正在研究 numba 以进一步加速此代码。一个原因是代码显然没有 运行 并行化(只使用了一个核心),所以我认为 numba 的 @jit(parallel=True) 装饰器可以提供帮助。 (据我所知,它没有。)每当我尝试使用 @jit(nopython=True) 时,都会引发异常,所以我想这意味着 numba 无法处理底层的 xarray 函数。

所以:

我认为没有 python=True 的 numba 应该只 运行 具有使用纯 python 或 numpy 代码的函数,没有像 [= 这样的自定义 python 对象21=]。请参阅 "will Numba work for my code?",其中指定它不会很好地优化使用 pandas 数据帧的操作。

"Note that Pandas is not understood by Numba and as a result Numba would simply run this code via the interpreter but with the added cost of the Numba internal overheads!" -

https://numba.pydata.org/numba-doc/latest/user/5minguide.html

我认为 xarray 也是如此。

如果您想要加速的代码的关键部分可以转换为(通用的)ufunc 并使用 numba.vectorize or numba.guvectorize, you could then use xarray.apply_ufunc 进行优化,以将它们应用于您的 xarray 数据,并自动处理维度和广播。

根据您的代码,使用 the xarray Dask interface 并行化和优化计算也可能会有所帮助,甚至更容易 and/or 更有用。在很多情况下,它可以像调用 .chunk() 方法一样简单,执行必要的操作并最终在最后调用 .compute() 方法。

要回答问题的第一部分,是的,我在我的项目中结合使用了这些方法,see here for a real-world example

来晚了,但是 https://github.com/numbagg/numbagg 有一组示例函数和一些有用的实用程序来集成 numba 和 xarray。

xarray 直接使用这个库,例如它是如何在 n 维上实现指数移动平均线的:https://github.com/numbagg/numbagg/blob/v0.2.1/numbagg/moving.py#L8

(披露——numbagg + xarray 的核心开发者)