首先,解决内存问题的最佳方法是使用迭代器/生成器而不是列表:
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)
减少这种刚刚超过一分钟。