如何将python多处理与生成器一起使用



我想在python中使用具有生成器函数的多处理

假设我有一个庞大的列表列表big_list,我想使用多处理来计算值。如果我使用返回值的"传统"函数,这很简单:

import concurrent
def compute_function(list_of_lists):
return_values = []   ## empty list
for list in list_of_lists:
new_value = compute_something(list)    ## compute something; just an example
return_values.append(new_value)  ## append to list
return return_values
with concurrent.futures.ProcessPoolExecutor(max_workers=N) as executor:
new_list = list(executor.map(compute_function, big_list))

但是,以这种方式使用列表过于占用内存。所以我想使用生成器函数:

import concurrent
def generator_function(list_of_lists):
for list in list_of_lists:
new_value = compute_something(list)    ## compute something; just an example
yield new_value
with concurrent.futures.ProcessPoolExecutor(max_workers=N) as executor:
new_list = list(executor.map(generator_function, big_list))

我的问题是,你不能腌发电机。对于其他数据结构,这个问题有一些变通方法,但我认为生成器没有。

我怎样才能做到这一点?

您可以使用itertools.chain.from_iterable迭代子列表,在big_list中进行更深一层的枚举。

import concurrent
import itertools
def compute_function(item):
return compute_something(item)
with concurrent.futures.ProcessPoolExecutor(max_workers=N) as executor:
for result in executor.map(compute_function,
itertools.chain.from_iterable(big_list)):
print(result)

生成器只是一个保存状态的奇特循环,它类似于迭代器逻辑,它为您提供了nexthasNext和类似的api,所以您的循环会要求迭代器获取下一项(只要它有下一项(

发生器的注入完全取决于开发者,它可以通过实现

  • 将所有数据加载到内存中,然后遍历next,从而实现无内存效率,例如for i in [1,2,3,4]
  • 逐行读取某个文件,例如for line in file
  • 如果生成函数已知,则根据上一个生成的元素生成下一个元素,例如range(100)
  • 还有更多

都有一个共同的要求,生成器需要保持其当前状态,以便知道下一个状态下yield的内容,从而使其非常有状态,这反过来又使其在多处理中使用非常糟糕。。。

您可以使用映射减少类似的逻辑来解决这个问题,并将整个列表拆分为小的子列表,将这些子列表传递给工作者,并将他们的所有输出连接到最终结果

相关内容

  • 没有找到相关文章

最新更新