python generator:并行解压整个发电机
问题内容:
假设我有一个生成器,其__next__()
功能有些昂贵,我想尝试并行化调用。我应该在哪里抛出并行化?
为了更具体一点,请考虑以下示例:
# fast, splitting a file for example
raw_blocks = (b for b in block_generator(fin))
# slow, reading blocks, checking values ...
parsed_blocks = (block_parser(b) for b in raw_blocks)
# get all parsed blocks into a data structure
data = parsedBlocksToOrderedDict(parsed_blocks)
最基本的是将第二行更改为进行并行化的内容。是否有一些生成器魔咒可以使发电机(在第3条)线上并行打开包装?__next__()
并行呼叫?
问题答案:
不能。您必须next()
顺序调用,因为任何非平凡的生成器的下一个状态都由其当前状态决定。
def gen(num):
j=0
for i in xrange(num):
j += i
yield j
如果不知道在每个生成器产生值的状态,就无法并行化对上述生成器的调用。但是,如果您知道这一点,则无需运行它。