在 Pool.map 中使用可迭代的生成器是否合理
Is it reasonable to use a generator as iterable in Pool.map
Pool.map 需要一个可调用对象作为其第一个参数,一个可迭代对象作为其第二个参数(参见 Python Docs)。
它会将可迭代对象分成块并将它们传递给池中的工作人员。
如果可迭代本身是一个生成器,这可能吗?或者它必须是一个序列(列表,np.array 等)
生成器工作得很好,但由于工作被急切地调度,它必须以一种或另一种方式有效地实现整个生成器才能真正完成工作。碰巧的是,the implementation of Pool.map
list
-ifies any iterable
without __len__
在它真正开始调度工作之前,所以传递生成器只是意味着在它被迫在内存中实现生成器之前有一个轻微的延迟。
如果你想避免这种情况,请使用 imap
或 imap_unordered
,两者都会分派 "live"(尽管目前甚至 dispatch well ahead of the results being returned,所以你可能会结束一次实现大部分生成器,如果不是全部)。
Pool.map 需要一个可调用对象作为其第一个参数,一个可迭代对象作为其第二个参数(参见 Python Docs)。
它会将可迭代对象分成块并将它们传递给池中的工作人员。
如果可迭代本身是一个生成器,这可能吗?或者它必须是一个序列(列表,np.array 等)
生成器工作得很好,但由于工作被急切地调度,它必须以一种或另一种方式有效地实现整个生成器才能真正完成工作。碰巧的是,the implementation of Pool.map
list
-ifies any iterable
without __len__
在它真正开始调度工作之前,所以传递生成器只是意味着在它被迫在内存中实现生成器之前有一个轻微的延迟。
如果你想避免这种情况,请使用 imap
或 imap_unordered
,两者都会分派 "live"(尽管目前甚至 dispatch well ahead of the results being returned,所以你可能会结束一次实现大部分生成器,如果不是全部)。