为什么一个多处理过程完成相同工作的时间要长两倍?

时间:2019-01-14 17:58:05

标签: python multiprocessing

我正在Blender中进行一些图像分析,并希望使用多重处理以减少计算时间。但是,当我将一个像素值列表分成4个进程之间的4个部分时,每个进程然后将其列表复制到一个调用的函数中,事实证明,一个多处理进程在复制列表上的工作要比单个进程慢。为什么会这样呢?我有2个核心和4个逻辑处理器的奔腾G4620。而且我必须添加,当我将列表分为两部分时,差异并不显着,但仍然存在(单个和多个进程分别为5秒和6.2秒)。

from time import time

def modify(pixels): 
    this_pixels = list(pixels)[:]

    start = time()
    for j in range(1000): # in order to do something
        for i in range(len(this_pixels)):
            this_pixels[i] = 1.0
    end = time()
    print(__name__, 'Time for computing the copied list:', round(end-start,2), 'len of list:', len(this_pixels))

if __name__ == '__main__':
    import bpy
    import sys

    sys.executable = bpy.app.binary_path_python
    __file__ = bpy.data.texts[0].filepath

    from multiprocessing import Process

    D = bpy.data

    img = D.images[0]
    pixels = img.pixels[:]

    pixels1 = img.pixels[:int(len(pixels)/4)]
    pixels2 = img.pixels[int(len(pixels)/4):int(len(pixels)/2)]
    pixels3 = img.pixels[int(len(pixels)/2):int(len(pixels)*3/4)]
    pixels4 = img.pixels[int(len(pixels)*3/4):int(len(pixels))]

    p1 = Process(target=modify,args=(pixels1,))
    p2 = Process(target=modify,args=(pixels2,))
    p3 = Process(target=modify,args=(pixels3,))
    p4 = Process(target=modify,args=(pixels4,))

    start = time()
#    modify(pixels1)
#    modify(pixels2)
#    modify(pixels3)
#    modify(pixels4)

    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    end = time()

    print('Overall time:', round(end-start,2))

分别为普通处理和多重处理的结果 :

    __main__ Time for computing the copied list: 2.5 len of list: 66000
    __main__ Time for computing the copied list: 2.52 len of list: 66000
    __main__ Time for computing the copied list: 2.52 len of list: 66000
    __main__ Time for computing the copied list: 2.52 len of list: 66000
    Overall time: 10.08

    __mp_main__ Time for computing the copied list: 4.86 len of list: 66000
    __mp_main__ Time for computing the copied list: 4.87 len of list: 66000
    __mp_main__ Time for computing the copied list: 4.8 len of list: 66000
    __mp_main__ Time for computing the copied list: 4.68 len of list: 66000
    Overall time: 5.63

编辑: 好吧,这很有趣。在另一个类似的测试中,如果在两个进程之间进行分配,则总体上最显着的加速发生需要花费8.65秒(相比之下,单个进程花费了13.88秒)。在三个过程之间-7.66秒,四个之间-与三个过程相同。

尽管使用三个或四个进程进行处理没有任何好处,但CPU利用率的差异却很大-分别为75%和100%。

0 个答案:

没有答案