假设我有一个生成器,其__next__()功能有些昂贵,我想尝试并行化调用。我应该在哪里抛出并行化?
__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()顺序调用,因为任何非平凡的生成器的下一个状态都由其当前状态决定。
next()
def gen(num): j=0 for i in xrange(num): j += i yield j
如果不知道在每个生成器产生值的状态,就无法并行化对上述生成器的调用。但是,如果您知道这一点,则无需运行它。