我刚刚看完这个关于多处理的视频,在玩的过程中,我对使用 for 循环时发生的速度变慢感到困惑。
在视频中,执行以下代码来演示多处理的速度
a = mp.Process(target=counter, args=(25000000,))
b = mp.Process(target=counter, args=(25000000,))
c = mp.Process(target=counter, args=(25000000,))
d = mp.Process(target=counter, args=(25000000,))
a.start()
b.start()
c.start()
d.start()
b.join()
a.join()
c.join()
d.join()
我看到这个并想:“为什么不直接使用 for 循环呢?我有 16 个 CPU 核心,不想写出 16 个变量名”
因此,作为开始,我将代码更改为
processes = []
for i in range(1, 4):
processes.append(mp.Process(target=counter, args=(250000000,)))
for i in range(len(processes)):
processes[i].start()
for i in range(len(processes)):
processes[i].join()
当执行此操作时,与单个变量代码的时间相比,所花费的时间要长得多(10.8 秒,而只有 1.8 秒)。为什么会发生这种事?
这部分是罪魁祸首:
for i in range(len(processes)):
processes[i].join()
在这里,您等待每个进程一一完成,这使得您的代码有效地顺序化。我认为你应该尝试在这里使用ProcessPool同时加入多个线程
导入多重处理 导入时间
定义工作(项目): # 模拟一些计算工作 结果 = 项目 * 项目 time.sleep(0.1) # 模拟计算工作 返回结果
定义主函数(): 数据=列表(范围(1000))
# Sequential execution
start_time = time.time()
results_seq = [work(item) for item in data]
seq_time = time.time() - start_time
# Parallel execution with multiprocessing
start_time = time.time()
with multiprocessing.Pool() as pool:
results_parallel = pool.map(work, data)
parallel_time = time.time() - start_time
print(f"Sequential Time: {seq_time} seconds")
print(f"Parallel Time: {parallel_time} seconds")
if name == "main": 主要()