您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Python中使用多重处理并行求和循环

如何在Python中使用多重处理并行求和循环

首先,解决内存问题的最佳方法是使用迭代器/生成器而不是列表:

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

python3中,range()生成一个迭代器,因此仅在python2中需要

现在,当您想将处理分为不同的进程或cpu内核时,就可以使用多处理。如果您不需要控制单个工作人员,那么最简单的方法就是使用进程池。这将使您将函数映射到池并获取输出。您也可以选择apply_async一次将一项作业应用到池中,并得到延迟的结果,您可以使用.get()

import multiprocessing
from multiprocessing import Pool
from time import time

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

# map requires a function to handle a single argument
def sn((low,high)):
    return sum_nums(low, high)

if __name__ == '__main__': 
    #t = time()
    # takes forever   
    #print sum_nums(1,10**10)
    #print '{} s'.format(time() -t)
    p = Pool(4)

    n = int(1e8)
    r = range(0,10**10+1,n)
    results = []

    # using apply_async
    t = time()
    for arg in zip([x+1 for x in r],r[1:]):
        results.append(p.apply_async(sum_nums, arg))

    # wait for results
    print sum(res.get() for res in results)
    print '{} s'.format(time() -t)

    # using process pool
    t = time()
    print sum(p.map(sn, zip([x+1 for x in r], r[1:])))
    print '{} s'.format(time() -t)

在我的机器,只调用sum_nums了10 ** 10需要近90分钟,但使用Pool(8)n=int(1e8)减少这种刚刚超过一分钟。

python 2022/1/1 18:28:35 有383人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶