xarray 的 apply_ufunc 中的 dask=parallelized 和 dask=allowed 有什么区别?

Tho*_*las 5 python numpy numpy-ufunc dask python-xarray

在函数 apply_ufunc的xarray 文档中,它说:

dask: ‘forbidden’, ‘allowed’ or ‘parallelized’, optional

    How to handle applying to objects containing lazy data in the form of dask arrays:

    ‘forbidden’ (default): raise an error if a dask array is encountered.
    ‘allowed’: pass dask arrays directly on to func.
    ‘parallelized’: automatically parallelize func if any of the inputs are a dask array. 
                    If used, the output_dtypes argument must also be provided. 
                    Multiple output arguments are not yet supported.
Run Code Online (Sandbox Code Playgroud)

Parallel Computing的文档页面中,有一个注释:

对于大多数已经由 dask 包装的 NumPy 函数,使用预先存在的 dask.array 函数通常是一个更好的主意,通过使用预先存在的 xarray 方法或 apply_ufunc() 与 dask='allowed'。与 dask='parallelized' 提供的通用加速不同,Dask 通常可以有一个更有效的实现,它利用问题的专门结构。

但是,我仍然不清楚这两个选项之间的区别是什么。是否allowed仍然对块进行一一操作以降低内存使用率?将allowed依然并行如果施加ufunc只使用DASK操作?为什么parallelized要求您提供更多有关 ufunc 输出(即参数output_dtypes, output_sizes)的信息allowed

sho*_*yer 4

dask='allowed'意味着您正在应用一个已经知道如何处理 dask 数组的函数,例如,根据dask.array操作编写的函数。在大多数情况下,这确实意味着该函数将逐个对块进行操作以降低内存使用量,并将并行应用计算。

dask='parallelized'需要用户提供更多信息,因为它创建自己的包装器,允许提供的函数通过使用低级 dask.array 函数(如 )来作用于 dask 数组atop。使用dask='parallelized',您可以提供一个只知道如何处理 NumPy 数组的函数,并将xarray.apply_ufunc其扩展为处理 dask 数组。