我试图用 Python 中的多处理来加速一些代码,但我无法理解一点。假设我有以下愚蠢的功能:
import time
from multiprocessing.pool import Pool
def foo(_):
for _ in range(100000000):
a = 3
Run Code Online (Sandbox Code Playgroud)
当我在笔记本电脑(英特尔 - 8 核 cpu)上运行此代码而不使用多处理(请参阅下面的代码)时,所用时间约为 2.31 秒。
t1 = time.time()
foo(1)
print(f"Without multiprocessing {time.time() - t1}")
Run Code Online (Sandbox Code Playgroud)
相反,当我使用 Python 多处理库(请参阅下面的代码)运行此代码时,所用时间约为 6.0 秒。
pool = Pool(8)
t1 = time.time()
pool.map(foo, range(8))
print(f"Sample multiprocessing {time.time() - t1}")
Run Code Online (Sandbox Code Playgroud)
据我所知,我知道在使用多处理时有一些时间开销,主要是由于需要产生新进程和复制内存状态。然而,这个操作应该只在处理最初产生时执行一次,并且不应该那么大。
那么我在这里缺少什么?我的推理有问题吗?
编辑:我认为最好更明确地说明我的问题。我在这里期望的是多处理代码比顺序代码稍慢。确实,我没有将整个工作拆分到 8 个内核,但我并行使用 8 个内核来完成相同的工作(因此在理想的世界中,处理时间应该或多或少保持不变)。考虑到产生新进程的开销,我预计时间会增加一些(不是太大)百分比,但不会增加约 2.60 倍。
我正在尝试解决一个具有超过 45.000 个二进制变量和约 350.000 个约束的大规模线性整数优化问题 (MILP)。
我正在使用Pulp来解决问题,但我无法在合理的时间内找到解决方案。
有什么方法可以大大加快优化过程吗?例如: