python - 如何在 Python 中使用多处理对循环进行并行求和

标签 python multiprocessing

我很难理解如何使用 Python 的多处理模块。

我有一个从 1n 的总和,其中 n=10^10,它太大而无法放入列表中,似乎是许多使用多处理的在线示例的主旨。

有没有办法将范围“拆分”成一定大小的段,然后对每个段求和?

例如

def sum_nums(low,high):
    result = 0
    for i in range(low,high+1):
        result += i
    return result

我想通过将 sum_nums(1,10**10) 分成许多 sum_nums(1,1000) + sum_nums(1001,2000) + sum_nums(2001) 来计算它,3000)... 等等。我知道有一个闭式 n(n+1)/2 但假装我们不知道。

这是我试过的

import multiprocessing

def sum_nums(low,high):
    result = 0
    for i in range(low,high+1):
        result += i
    return result

if __name__ == "__main__":
    n = 1000 
    procs = 2 

    sizeSegment = n/procs

    jobs = []
    for i in range(0, procs):
        process = multiprocessing.Process(target=sum_nums, args=(i*sizeSegment+1, (i+1)*sizeSegment))
        jobs.append(process)

    for j in jobs:
        j.start()
    for j in jobs:
        j.join()

    #where is the result?

最佳答案

我发现 multiprocess.Pool 和 map() 的用法更加简单

使用您的代码:

from multiprocessing import Pool

def sum_nums(args):
    low = int(args[0])
    high = int(args[1])
    return sum(range(low,high+1))

if __name__ == "__main__":
    n = 1000 
    procs = 2 

    sizeSegment = n/procs

    # Create size segments list
    jobs = []
    for i in range(0, procs):
        jobs.append((i*sizeSegment+1, (i+1)*sizeSegment))

    pool = Pool(procs).map(sum_nums, jobs)
    result = sum(pool)

    >>> print result
    >>> 500500

关于python - 如何在 Python 中使用多处理对循环进行并行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785427/

相关文章:

python - 在 Ubuntu 14.04 上安装 django-cms

python - 如何有效地让多处理进程读取不可变的大数据

Python-多处理守护进程

python - python 的基本多处理

python - 在 python 多处理工作池中使用初始化

python - 用户配置文件 gmail api 中的历史记录 ID 是什么?

python - python 中的数字 - 010

python - 在Python中有效地将稀疏数据帧转换为密集数据帧

python - 使用Python收集天气数据并写入文件

python - 始终并行运行恒定数量的子进程