美文网首页python自学
用python的multiprocessing多进程来计算1-1

用python的multiprocessing多进程来计算1-1

作者: 纷飞清扬 | 来源:发表于2019-10-27 17:04 被阅读0次

多进程合适计算类。当计算结果很大的时候,采用多进程。我们将1到100000000分段,用多进程对每段进行求和。在将每段求和的结果汇集相加,就得到1到100000000的和了。

########## 用多进程计算1-100000000的和 ###########
from multiprocessing import Pool

def sum_nums(start,end):
    # 计算分段中的数据之和
    result = 0
    for i in range(start,end+1):
        result += i
    return result

def main():
    pool = Pool(8)
    n = int(1e4)
    r = range(0,10**8+1,n)
    # 以0开头,100000000结尾,步长n为10000。即结果为0,10000,20000,30000……
    results = []
    for j in zip([x+1 for x in r],r[1:]):
        # x+1 for x in r结果为1,10001,20001,30001……
        # r[1:]结果为10000,20000,30000,40000……个数比上面的少1个
        # 用zip函数,结果为(1,10000),(10001,20000),(20001,30000)……列表长度与最短的对象相同,即与r[1:]个数相同
        # 这样就把1-100000000分段了。
        s = pool.apply_async(sum_nums,j)
        # 此处j是一个元组,所以直接在apply_async括号里填j就行
        # 此处得到的结果是multiprocessing.pool.ApplyResult 这种形式,需要用get函数将返回结果的值取出
        results.append(s)
    sum_results = 0
    for res in results:
        sum_results += res.get()
        # 此处res.get()取出的值是int类型

    pool.close()
    pool.join()
    print(sum_results)

if __name__ == '__main__':
    main()


程序运行结果为5000000050000000,正确。

总结:

求和用for循环和range函数搭配使用
当数据很多时,选定分段的步长,然后将数据分段。此处用到的也是python最基本的list下标操作(r[1:])和for循环
用zip函数,它将对象中对应的元素打包成一个个元组,这样传递给我们的求和函数sum_nums,作为求和的数据开始值和结束值
用进程池返回的不是int类型的值,我们需要用get()函数将返回的每个分段求和结果的值取出,再进行所有分段的值相加,最后得出1-100000000所有数据之和
心得:

刚开始百思不得其解,不知如何运动多进程求和。最后在Stack Overflow上找到相关的答案。自己对照着思路,解法,将代码改进敲一遍。期间遇到看着熟悉但不太懂的函数,如zip函数,就去网上搜它的资料,理解它的用法。当求和没得到期望的数值,通过答应结果的type,确定它的数据类型,然后在网上搜索原因,最后找到解决方法。这本来是一个简单的求和,通过这次练习,我明白了掌握最基本的python数据结果,函数,还能如此运用。以后要多加练习。
————————————————
版权声明:本文为CSDN博主「纷飞清扬」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ruanxuan/article/details/102768488

相关文章

网友评论

    本文标题:用python的multiprocessing多进程来计算1-1

    本文链接:https://www.haomeiwen.com/subject/flcmvctx.html