Gro*_*vyP 3 python multiprocessing python-multiprocessing
通过使用map函数multiprocessing库中当使用 2 个以上的进程时,我看不到执行时间的差异。我正在使用 4 个内核运行程序。
实际代码非常简单,计算前 4000 个斐波那契数 4 次(= 内核数量)。它在 N 个内核之间平均分配工作(例如,当使用具有 2 个进程的池时,每个进程将计算前 4000 个斐波那契数次)。整个过程是在 N = 1 到核心数量的情况下完成的。
输出,每一行的核心数量和相应的执行时间(以秒为单位)是:
有谁知道为什么在超过 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()
Run Code Online (Sandbox Code Playgroud)
如果您使用的是相当现代的 CPU,multiprocessing.cpu_count()则不会为您提供机器拥有的物理内核数量,而是超线程数量。简而言之,超线程允许单个物理核心拥有n(最常见的是两个)管道,这会让您的操作系统误以为您拥有n的核心数量是您实际拥有的数量的两倍。这很有用,当您执行一些可能会导致核心数据饿死的事情时(最显着的是,由缓存未命中引起的 IO 或 RAM 查找),但您的工作负载纯粹是算术,并且不太可能使 CPU 饿死,从而导致超线程几乎没有收益。您可能获得的小收益将被多处理开销所掩盖,这是非常重要的。
聚苯乙烯
我通常将此类内容作为评论发布,但我已经超出了评论大小限制。顺便说一句,如果您选择了斐波那契数列作为示例,那么您可能需要考虑一种更快的算法:快速斐波纳契计算
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |