我没有进行多处理的代码如下,花费的时间是0:00:03.044280:
def execute_it():
number = 10000000
listing_1 = range(number)
listing_2 = range(number)
listing_3 = range(number)
start = datetime.now()
task(listing_1, listing_2, listing_3)
print datetime.now() - start
def task(listing_1, listing_2, listing_3):
for l1, l2, l3 in zip(listing_1, listing_2, listing_3):
l1 + l2 + l3
我想使用多处理来减少时间,我尝试的代码如下:
def execute_it():
number = 10000000
listing_1 = list(range(number))
listing_2 = list(range(number))
listing_3 = list(range(number))
params = zip(listing_1, listing_2, listing_3)
start = datetime.now()
pool = mp.Pool(processes=5)
pool.map(task, params)
pool.close()
print datetime.now() - start
def task(params):
params[0] + params[1] + params[2]
它花费0:00:15.654919 !!!
我的代码有什么问题?我确定他们做的事情是相同的。
答案 0 :(得分:1)
多处理版本需要更长的时间,因为它实际上与单进程版本相同,外加一些其他内容,例如创建进程和运行map。
您可以将zip替换为itertools.izip
,将mp.map
替换为mp.imap
,以获得预期的并行效果,否则所有繁琐的处理都会在主过程中发生。
from itertools import izip
...
def execute_it():
number = 10000000
listing_1 = list(range(number))
listing_2 = list(range(number))
listing_3 = list(range(number))
params = izip(listing_1, listing_2, listing_3)
start = datetime.now()
pool = mp.Pool(processes=5)
pool.imap(task, params)
pool.close()
print datetime.now() - start