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