为什么在Pool中使用了2个以上的进程就没有影响了?
Why is there no influence after using more than 2 processes in Pool?
通过使用 multiprocessing
库中的 map 函数,我发现使用 2 个以上进程时执行时间没有差异。我是 运行 使用 4 核的程序。
实际代码非常简单,计算前 4000 个斐波那契数 4 次(= 核心数)。它在 N 个核心之间平均分配工作(例如,当使用具有 2 个进程的 Pool 时,每个进程将计算前 4000 个斐波那契数两次)。整个过程是针对 N = 1 直到核心数量完成的。
每行的核心数量和相应的执行时间(以秒为单位)的输出是:
- 3,147
- 1,72
- 1,896
- 1.899
有谁知道为什么超过 2 个内核时执行时间没有减少?实际代码是:
import multiprocessing
from time import time
def F(_):
for n in range(4 * 10 ** 3):
a, b = 0, 1
for i in range(0, n):
a, b = b, a + b
return
def pool_fib():
n_cores = multiprocessing.cpu_count()
args = list(range(multiprocessing.cpu_count()))
for i in range(1, n_cores + 1):
with multiprocessing.Pool(i) as p:
start = time()
p.map(F, args)
print(i, time() - start)
if __name__ == '__main__':
pool_fib()
假设您使用的是相当现代的 CPU,multiprocessing.cpu_count()
不会为您提供您机器的物理内核数量,而是为您提供超线程数量。简而言之,超线程允许单个物理内核拥有 n
(最常见的是两个)管道,这会让你的 OS 认为你有 n
倍的管道你真正拥有的核心。这很有用,当你正在做一些可能使核心数据不足的事情时(最值得注意的是,由缓存未命中引起的 IO 或 RAM 查找),但你的工作量纯粹是算术,它不太可能让你的 CPU,导致超线程几乎没有收益。并且你可能获得的小收益将被多处理开销所掩盖,这是非常重要的。
P.S.
我通常post这种东西作为评论,但我已经超过了评论大小的限制。顺便说一句,如果您选择斐波那契数列不仅仅是为了举例,您可能需要考虑一种更快的算法:Fast Fibonacci computation
通过使用 multiprocessing
库中的 map 函数,我发现使用 2 个以上进程时执行时间没有差异。我是 运行 使用 4 核的程序。
实际代码非常简单,计算前 4000 个斐波那契数 4 次(= 核心数)。它在 N 个核心之间平均分配工作(例如,当使用具有 2 个进程的 Pool 时,每个进程将计算前 4000 个斐波那契数两次)。整个过程是针对 N = 1 直到核心数量完成的。
每行的核心数量和相应的执行时间(以秒为单位)的输出是:
- 3,147
- 1,72
- 1,896
- 1.899
有谁知道为什么超过 2 个内核时执行时间没有减少?实际代码是:
import multiprocessing
from time import time
def F(_):
for n in range(4 * 10 ** 3):
a, b = 0, 1
for i in range(0, n):
a, b = b, a + b
return
def pool_fib():
n_cores = multiprocessing.cpu_count()
args = list(range(multiprocessing.cpu_count()))
for i in range(1, n_cores + 1):
with multiprocessing.Pool(i) as p:
start = time()
p.map(F, args)
print(i, time() - start)
if __name__ == '__main__':
pool_fib()
假设您使用的是相当现代的 CPU,multiprocessing.cpu_count()
不会为您提供您机器的物理内核数量,而是为您提供超线程数量。简而言之,超线程允许单个物理内核拥有 n
(最常见的是两个)管道,这会让你的 OS 认为你有 n
倍的管道你真正拥有的核心。这很有用,当你正在做一些可能使核心数据不足的事情时(最值得注意的是,由缓存未命中引起的 IO 或 RAM 查找),但你的工作量纯粹是算术,它不太可能让你的 CPU,导致超线程几乎没有收益。并且你可能获得的小收益将被多处理开销所掩盖,这是非常重要的。
P.S.
我通常post这种东西作为评论,但我已经超过了评论大小的限制。顺便说一句,如果您选择斐波那契数列不仅仅是为了举例,您可能需要考虑一种更快的算法:Fast Fibonacci computation