所以案例如下: 我想比较矩阵乘法的运行时间 与ipython并行,只运行在单个核心上。
正常执行代码:
import numpy as np
n = 13
dim_1, dim_2, dim_3, dim_4 = 2**n, 2**n, 2**n, 2**n
A = np.random.random((dim_1, dim_2))
B = np.random.random((dim_3, dim_4))
start = timeit.time.time()
C = np.matmul(A,B)
dur = timeit.time.time() - start
在我的笔记本电脑上,这相当于大约24秒
如果我做同样的事情试图平行它。
我使用以下命令启动四个引擎:ipcluster start -n 4(我有4个核心)。
然后我在笔记本上跑:
from ipyparallel import Client
c = Client()
dview = c.load_balanced_view()
%px import numpy
def pdot(view_obj, A_mat, B_mat):
view_obj['B'] = B
view_obj.scatter('A', A)
view_obj.execute('C=A.dot(B)')
return view_obj.gather('C', block=True)
start = timeit.time.time()
pdot(dview, A, B)
dur1 = timeit.time.time() - start
dur1
大约需要34秒。 当我在系统监视器中查看时,我可以看到,两者都有 使用所有核心的情况。在平行的情况下似乎 是一个他们没有100%使用的开销(我想是这样的 它们分散在引擎中的部分)。 在非并行部分,所有核心都立即使用100%。 这让我感到惊讶,因为我一直认为python本质上是 在一个核心上运行。
如果有人对此有更深入的了解,会很高兴。