2

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 でのジェネレーターの通常の動作とは異なります。

foldでは、 ( ) を計算するとき、ジェネレーターのresult.compute()入力引数 ですか、それとも既にリストに変換されていますか?xadd_to_count

リストが非常に長い場合に興味があるため、遅延評価の方が効率的 b1 = db.from_sequence([10**6]*10)です。

で上記の問題を解決できるとbag.frequencies思いますが、遅延評価と効率的な削減についても同様の懸念があります。

私が理解していないDaskの基本的な側面はありますか、それとも単に怠惰なだけですか?これを自分で理解するためにコードをどこで調べることができますか?

4

1 に答える 1