在尝试并行化我的主程序之前,我试图通过在Python中并行化一段玩具代码来显示某种改进。我决定采用的方法是并行执行四个矩阵求逆,然后执行相同的矩阵求逆一次并乘以4以估计问题需要多长时间才能完成串行。我知道并行化会有一些不断的开销,但作为一阶近似,这对我的目的应该没问题。
我遇到的问题是并行计算运行得足够慢,以至于四个反转中的每一个都是串行执行的。
我已将我的代码与我进行比较。请注意,我尝试了两种不同的方法,一种只使用多处理,一种使用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