假设我有一个代码,使用多处理会返回一个包含200000个项目的列表,这些项目是它们自己的列表(在标记为点1的代码中(。如果我只需要一个包含内部项的列表,我会再次迭代收到的列表(在标记为点2的代码中(。
问题:标记为点2的线不平行,因此需要宝贵的时间。有没有一种方法可以将所有数据直接从函数cu写入文档?
def cu(num):
return range(num)
pool = mp.Pool(processes=384)
results = [pool.apply_async(cu, args=(20, )) for ind in range(200000)]
docs = [p.get() for p in results] # point 1
docs = [point for item in docs for point in item] # point 2
pool.close()
pool.join()
我怀疑用多处理取代多线程将解决这个问题,但我担心这不会节省时间。
注意:这是一个最小的例子。
问题是,您只为一个操作运行一个池,但运行了200k次,但您希望池运行超过200k次操作。您需要将map_async
与生成器和itertools.chain.from_iterable
:一起使用
docs = itertools.chain.from_iterable(
pool.map_async(cu, args=(20 for _ in range(200000)))
)
这个解决方案是懒惰的,这意味着你需要使用迭代器来获取值(对它进行迭代(,你可以很容易地使用:
docs = list(docs)
或者如果你不想存储结果:
for doc in docs:
... #Do your stuff here