首先,解决内存问题的最佳方法是使用迭代器/生成器而不是列表: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)
在我的机器上,用10*10调用sum_nums几乎需要9分钟,但是使用Pool(8)和n=int(1e8)可以将此时间减少到一分钟多一点。