Python 如何按顺序聚合dask包的内容?

Python 如何按顺序聚合dask包的内容?,python,dask,Python,Dask,我希望使用非关联的聚合函数顺序聚合分区集合的内容,因此我不能使用Bag.fold或Bag.reduce 有Bag.acculate似乎可以执行此操作,但它返回一个包,其中包含一些每个分区的中间结果,而不仅仅是最终的聚合: >>> import dask.bag as db >>> >>> def collect(acc, e): ... if acc is None: ... acc = list() ...

我希望使用非关联的聚合函数顺序聚合分区集合的内容,因此我不能使用
Bag.fold
Bag.reduce

Bag.acculate
似乎可以执行此操作,但它返回一个包,其中包含一些每个分区的中间结果,而不仅仅是最终的聚合:

>>> import dask.bag as db
>>>
>>> def collect(acc, e):
...     if acc is None:
...         acc = list()
...     acc.append(e)
...     return acc
...
>>> b = db.from_sequence(range(10), npartitions=3)
>>> b.accumulate(collect, initial=None).compute()
[None,
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

基本上,我只对
累积输出的最后一个元素感兴趣,我不想在内存中保留中间步骤的副本。

包目前没有顺序还原操作,但它可以。今天实现这一点的一个简单方法是使用上面提到的
累计
,但只要求最后一个分区的最后一个元素。我们可以通过使用


事实上,我想
延迟
(或者从一开始就在一个循环中编写一个包含
延迟
调用的所有东西),但我想知道是否还有更“dask-ish”的方法可以做到这一点。对于这种情况,我们真的应该有一个
包。reduce
方法。一般来说,我会说切换到dask.delayed是“dask-ish”的方式。没有工具可以预测用户遇到的每一种情况。“Use dask.delayed”可能是对大约30%的#dask标记的堆栈溢出问题的答案。
acc = b.accumulate(collect, initial=None)
partitions = acc.to_delayed()
partitions[-1][-1].compute()