【发布时间】:2021-08-27 07:59:30
【问题描述】:
我有以下代码。
from itertools import repeat
from multiprocessing import Pool
import os
import numpy as np
a=[1,2,3]
b=[2,3,4]
def multi_run_wrapper(args):
return add(*args)
def add(x,y):
return x+y
if __name__ == "__main__":
pool = Pool( os.cpu_count())
results = pool.starmap(add,zip(a,b))
print(sum(results))
输出将是results= [3, 5, 7]。并打印出15。
所以这样,如果我想计算results的总和,我需要保存整个列表results。
有没有办法在不保存整个列表的情况下使用多处理?例如,在使用 mulprocessing 时对 results 求和。因为如果我的列表a 和b 变得超长,那么输出results 会占用太多内存,并且不适合我的笔记本电脑。
换句话说,我的目标是在不保存整个列表的情况下获得sum(results),但同时加快处理速度。
谢谢
【问题讨论】:
-
感觉像 Map/Reduce (pymotw.com/2/multiprocessing/mapreduce.html) 会做你想做的事。它专为大型数据集而构建。
-
“这个问题基本上和其他问题问的一样吗?” : 不。 meta.stackoverflow.com/a/408268/7317733 请确保在关闭问题之前确认为重复。
-
@AvidJoe 是的。链接的问题是关于迭代星图,或者换句话说,星图“不保存整个列表”。迭代星图是否用于求和或显示进度是无关紧要的。 FWIW,进度条做元素计数的内部总和。请务必在质疑时提供为什么重复不适合的原因。
-
@MisteMiyagi meta.stackoverflow.com/a/292372/7317733 。我是新来的,不知道如何看待这些帖子,但我觉得这个链接解释了我想说的话。我猜。因此,如果操作员只是阅读了链接的问题,他应该去 tqdm 并理解这一点“进度条对元素计数进行内部求和”。甚至开始了解发生了什么?
-
@AvidJoe 他们应该看到另一个问题归结为迭代星图,这就是他们所问的。就像在您的第二个链接中一样,他们问“如何在
2*13中实现*”,另一个问题是“如何在4.5*27.3中实现*”。