为什么当我使用多处理时会花费更多时间?

时间:2018-08-21 01:29:01

标签: python

我没有进行多处理的代码如下,花费的时间是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 !!!

我的代码有什么问题?我确定他们做的事情是相同的。

1 个答案:

答案 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