来自C ++,我习惯于使用表达式模板进行库操作,其中的矩阵运算如下:
D = A*(B+C)
不要创建临时元素,也不创建元素
D(i,j) = A(i,j)*(B(i,j)+C(i,j))
操作是在循环内完成的,没有为右侧的操作创建临时矩阵。
Dask数组有可能吗? Dask的“惰性评估”是否也执行此操作,或者该术语仅指的是根据操作图进行的计算。
谢谢。
答案 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