我正在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%。