Python 生成器何时转换为Dask中的列表?

Python 生成器何时转换为Dask中的列表?,python,dask,Python,Dask,在Dask中,生成器什么时候转换为列表,或者它们通常是惰性地使用的? 例如,使用以下代码: from collections import Counter import numpy as np import dask.bag as db def foo(n): for _ in range(n): yield np.random.randint(10) def add_to_count(acc, x): acc.update(x) return acc

在Dask中,生成器什么时候转换为列表,或者它们通常是惰性地使用的? 例如,使用以下代码:

from collections import Counter
import numpy as np
import dask.bag as db

def foo(n):
    for _ in range(n):
        yield np.random.randint(10)

def add_to_count(acc, x):
    acc.update(x)
    return acc

def add(x,y):
    return x + y

b1 = db.from_sequence([1,2,3,4,5])
b2 = b1.map(foo)
result = b2.fold(add_to_count, add, Counter())
我得到以下输出,其中发电机 已(合理地)转换为清单供我检查:

>>> b2.compute()
[[5], [5, 6], [3, 6, 1], [5, 6, 6, 0], [5, 6, 6, 0, 3]]
虽然合理,但它不同于我通常期望生成器在Python中的行为,即需要显式转换为列表

因此,在计算
折叠时(
result.compute()
), 是
add\u to\u count
的输入参数
x
生成器,还是已转换为列表

我对列表很长的情况很感兴趣, 所以惰性评估更有效,比如,
b1=db.from_序列([10**6]*10)

我猜我也可以用
bag.frequencies
解决上面的问题,但我对延迟计算和有效缩减也有类似的担忧


Dask是否有一个基本方面我不是在摸索,或者我只是在偷懒,我在哪里可以自己研究代码来解决这个问题?

不太合适,但我将提供一个稍微不同的问题的答案:

Dask.bag添加了防御调用,以列出“为您,以防您决定在一次计算中使用该包两次:

x = b.map(func1, b)
y = b.map(func2, b)
compute(x.frequencies(), b.frequencies())
这在使用后端(如多处理或分布式)时也很有用,因为我们不能跨进程边界发送生成器,但可以发送列表

然而,在可能的情况下,这些对
list
的防御性调用会在计算之前进行优化,以促进懒惰


总之,在可能的情况下,一切都应该按照您想要的方式工作,但当懒惰妨碍正确性时,将恢复为具体的非懒惰值。

好吧,很容易,添加
print(type(x))
add_to_count()
尝试使用不同的调度器似乎可以确认
x
确实是一个生成器对象。我会把这个打开一点,以防有什么补充。谢谢。这正是我想要的。文档中是否有概述(我找不到),是否有用?如果你这么认为的话,我可能需要一些帮助来尝试一下。