我试图用 numpy 并行化一些数据扩展,我发现并行化版本比串行版本花费的时间长几个数量级,所以我一定犯了一些愚蠢的错误。
首先,一些假数据来设置问题:
Ngroups = 1.e6
some_group_property = np.random.uniform(0, 100, Ngroups)
mem1_occupation = np.random.random_integers(0, 5, Ngroups)
mem2_occupation = np.random.random_integers(0, 5, Ngroups)
occupation_list = [mem1_occupation, mem2_occupation]
现在进行串行计算:我将组数据扩展为组成员的数组:
mem1_property = np.repeat(some_group_property, mem1_occupation)
mem2_property = np.repeat(some_group_property, mem2_occupation)
这是并行版本:
import functools
from joblib import Parallel, delayed
def expand_data(prop, occu_list, index):
return np.repeat(prop, occu_list[index])
exp_data_1argfunc = functools.partial(expand_data, some_group_property, occupation_list)
result = Parallel(n_jobs=2)(delayed(exp_data_1argfunc)(i) for i in range(len(occupation_list)))
我在 4 核机器上运行此代码,因此原则上为两个群体独立执行计算应该会给我大约 2 倍的加速。相反,串行计算需要约 0.1 秒,而并行计算需要 9 秒。这里发生了什么?