懒惰评估Dask数组以避免临时

时间:2018-11-09 21:43:10

标签: dask

来自C ++,我习惯于使用表达式模板进行库操作,其中的矩阵运算如下:

D = A*(B+C)

不要创建临时元素,也不创建元素

D(i,j) = A(i,j)*(B(i,j)+C(i,j))

操作是在循环内完成的,没有为右侧的操作创建临时矩阵。

Dask数组有可能吗? Dask的“惰性评估”是否也执行此操作,或者该术语仅指的是根据操作图进行的计算。

谢谢。

1 个答案:

答案 0 :(得分:0)

从2018年11月11日开始,答案是“是的,dask数组避免了大规模的完整临时对象,但是,不,它避免了在Numpy /逐块级别分配临时对象”。

Dask数组由许多Numpy数组组成。通过在Numpy数组块上执行这些操作,可以实现Dask数组操作。当您执行A * (B + C)时,该操作会在每个匹配的numpy数组块集上发生,因为numpy会执行该操作,其中包括分配临时对象。

但是,由于Dask可以按块进行操作,因此在继续操作之前不必分配所有(B + C)块。

您是正确的,因为Dask懒惰,因此有机会比Numpy更聪明。您可以在这里跟踪有关此问题的进度:https://github.com/dask/dask/issues/4038