我正在尝试使用Python的multiprocessing库,并希望了解其在不同数量的进程中的行为。
我假设将进程设置为大于内核数并没有任何好处。与该假设相反,下面的实验代码说,即使进程数超过核心数(在我的情况下为4),计算时间也会减少。
有人可以解释一下幕后发生的事情,并提供一些有关如何设置进程数的实用指南吗?
from multiprocessing import Pool, cpu_count
import time
from datetime import datetime
我的CPU计数。
cpu_count()
# 4
一项实验性任务,大约需要0.5秒。
def f(x):
time.sleep(0.5)
return x*x
def execute_time(processes):
t1 = datetime.now()
with Pool(processes) as p:
p.map(f, list(range(36)))
t2 = datetime.now()
return t2 - t1
for p in range(1, 25):
t = execute_time(p)
print(p, ":", t)
收益:
# 1 : 0:00:18.065411
# 2 : 0:00:10.051516
# 3 : 0:00:06.057016
# 4 : 0:00:04.562439
# 5 : 0:00:04.069810
# 6 : 0:00:03.173502
# 7 : 0:00:03.065977
# 8 : 0:00:03.082625
# 9 : 0:00:02.092880
# 10 : 0:00:02.090963
# 11 : 0:00:02.061613
# 12 : 0:00:01.704716
# 13 : 0:00:01.704880
# 14 : 0:00:01.615440
# 15 : 0:00:01.625117
# 16 : 0:00:01.621259
# 17 : 0:00:01.639741
# 18 : 0:00:01.236108
# 19 : 0:00:01.250113
# 20 : 0:00:01.255697
# 21 : 0:00:01.253459
# 22 : 0:00:01.260632
# 23 : 0:00:01.262124
# 24 : 0:00:01.247772
有意义的是,该功能需要18秒的时间(36 * 0.5秒= 18秒)。具有四个过程(18秒/ 4 = 4.5秒)的情况也是如此。但是令我惊讶的是,随着处理数量的增加,计算时间会减少。
答案 0 :(得分:0)
正如迈克尔·布彻(Michael Butscher)在评论中所说,这是def f(x):
out = 0
for i in range(5000000):
out += i
return x*x
def execute_time(processes):
t1 = datetime.now()
with Pool(processes) as p:
p.map(f, list(range(36)))
t2 = datetime.now()
return t2 - t1
for p in range(1, 25):
t = execute_time(p)
print(p, ":", t)
的一种特殊行为。在执行CPU密集型任务时,我看到了好处在于进程数等于内核数。
# 1 : 0:00:13.329320
# 2 : 0:00:07.528552
# 3 : 0:00:09.943043
# 4 : 0:00:07.756005
# 5 : 0:00:08.262304
# 6 : 0:00:07.653659
# 7 : 0:00:07.677038
# 8 : 0:00:07.591766
# 9 : 0:00:07.502283
# 10 : 0:00:07.710826
# 11 : 0:00:06.006874
# 12 : 0:00:09.720279
# 13 : 0:00:07.912836
# 14 : 0:00:07.616807
# 15 : 0:00:07.740225
# 16 : 0:00:07.721783
# 17 : 0:00:07.836259
# 18 : 0:00:07.665993
# 19 : 0:00:07.564645
# 20 : 0:00:07.653607
# 21 : 0:00:07.754377
# 22 : 0:00:07.886036
# 23 : 0:00:11.696323
# 24 : 0:00:07.674243
获取:
availabiities