【发布时间】:2017-06-13 18:29:15
【问题描述】:
在尝试并行化我的主程序之前,我试图通过在 Python 中并行化一段玩具代码来展示某种改进。我决定采用的方法是并行执行四次矩阵求逆,然后执行一次相同的矩阵求逆并乘以四来估计问题需要多长时间才能串行完成。我知道并行化会产生一些持续的开销,但作为一阶近似值,这对我的目的来说应该没问题。
我遇到的问题是并行计算运行速度很慢,以至于看起来四个反转中的每一个都只是在串行执行。
我已包含我的代码以进行比较。请注意,我尝试了两种不同的方法,一种仅使用多处理,另一种使用 joblib(已注释掉),两者都给了我相当的运行时间。 mp.cpu_count 返回 20 个可用 CPU,因此我确信这不是我的计算机的问题。
from joblib import Parallel, delayed
import multiprocessing as mp
import numpy as np
import time
if __name__ == '__main__':
A = np.random.random((10000,10000))
tA = [A,A,A,A]
print mp.cpu_count()
pool = mp.Pool(4)
t = time.time()
# results = Parallel(n_jobs=4)(delayed(np.linalg.inv)(i) for i in tA)
results = pool.map(np.linalg.inv, tA)
print time.time() - t
t = time.time()
temp = np.linalg.inv(A)
print (time.time()-t)*len(tA)
作为参考,这是我运行此代码时的输出
20
62.151000229
52.516007477
【问题讨论】:
-
打开一个新进程会给你的程序增加很多开销,因为你只是在做矩阵求逆,你从并行运行中节省的时间比增加的开销要少得多。
-
这将是一个恒定的开销。当我尝试反转 5000x5000 时,我看到了类似的差异。
-
@Ding,不是这样,至少有 2 点:(1)他的串行时序显示反转大约需要 13 秒 - 与创建新进程所需的时间相比,这是永恒的;并且,(2)
mp.Pool(4)创建了 4 个进程,并且该行不在正在计时的部分中。
标签: python numpy parallel-processing