【问题标题】:multiprocessing sum python [duplicate]多处理和python [重复]
【发布时间】: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 求和。因为如果我的列表ab 变得超长,那么输出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 中实现*”。

标签: python multiprocessing


【解决方案1】:

当进程在自包含的环境中运行时,您肯定会担心更少的事情:)。如果需要,可以使用Queue对象这样修改单个变量,实现进程间通信。

from itertools import repeat
from multiprocessing import Process, Queue
import os
import numpy as np

a=[1,2,3]
b=[2,3,4]

def multi_run_wrapper(args):
    return add(*args)
def add(queue,x,y):
    queue.put(queue.get(block=True)+x+y)  

if __name__ == "__main__":
    queue = Queue()
    queue.put(0)
    processes = []
        processes = [Process(target=add,args=(queue,x,y)) for x,y in zip(a,b)]
    for each in processes:
      each.start()
    for each in processes:
      each.join()
    print(queue.get(block=True)) # prints 15
    queue.close()
    queue.join_thread()
  • 如果你想使用Pool
from itertools import repeat
from multiprocessing import Pool, Queue
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):
    queue.put(queue.get(block=True)+x+y)   

if __name__ == "__main__":
    queue = Queue()
    queue.put(0)
    pool = Pool( os.cpu_count())
    pool.starmap(add,zip(a,b))
    print(queue.get(block=True))
    queue.close()
    queue.join_thread()
  • 在这里,您并没有存储每个进程的完整输出列表,而是与每个进程进行通信以进行修改。
  • 想出了一个快速的解决方案,但还没有测试过。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2018-04-22
    相关资源
    最近更新 更多