使用joblib.Parallel并行执行函数时的ValueError问题求解
问题:joblib并行执行函数时解包错误
我想用Python的joblib.Parallel并行循环执行Function_test函数100次,收集结果做后续分析,代码如下:
import joblib def FOMs_test(jj,image, Center_xy, BkgCenter_xy, roiSize_xy, Chnl,Resampling, Validation): # ... omit some code here _,dp[jj,ii], AUC[jj,ii], Pc[jj,ii] = Function_test (sig,bkg,channel,Noise,Resampling) print(jj) return dp, AUC, Pc dp, AUC, Pc = joblib.Parallel(n_jobs=3)(joblib.delayed(FOMs_test)(jj,image, Center_xy, BkgCenter_xy, roiSize_xy, Chnl,Resampling, Validation) for jj in range(2))
运行后出现以下错误:
0 1 0 1 0 1 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-2-81843d48c033> in <module> ----> 1 dp, AUC, Pc = joblib.Parallel(n_jobs=3)(joblib.delayed(FOMs_test)(jj,image, Center_xy, BkgCenter_xy, roiSize_xy, Chnl,Resampling, Validation) for jj in range(2)) ValueError: not enough values to unpack (expected 3, got 2)
解决方法
错误原因
joblib.Parallel执行后返回的是结果列表,列表长度等于循环次数(这里是2),每个列表元素是FOMs_test返回的元组(dp, AUC, Pc)。直接用dp, AUC, Pc = ...解包,相当于要求把列表拆成3个元素,但列表只有2个元素,因此报错。
另外原函数里的dp[jj,ii]写法存在逻辑错误:并行进程的内存是独立的,不能直接共享数组索引赋值,每个进程应返回单轮结果,最后在主进程合并。
修正步骤
- 调整
FOMs_test函数,使其返回单轮执行的结果(而非带索引的数组) - 先接收并行执行的结果列表,再拆分合并对应结果
修正后的代码
import joblib import numpy as np # 用于后续将结果合并为数组 def FOMs_test(jj, image, Center_xy, BkgCenter_xy, roiSize_xy, Chnl, Resampling, Validation): # ... 保留原有业务代码 ... # 获取当前轮次的单组结果,不再用索引赋值 _, dp_single, auc_single, pc_single = Function_test(sig, bkg, channel, Noise, Resampling) print(jj) # 返回单轮结果 return dp_single, auc_single, pc_single # 执行并行任务,得到结果列表 results = joblib.Parallel(n_jobs=3)( joblib.delayed(FOMs_test)(jj, image, Center_xy, BkgCenter_xy, roiSize_xy, Chnl, Resampling, Validation) for jj in range(2) # 改成range(100)即可执行100次 ) # 拆分结果:将所有轮次的dp、AUC、Pc分别合并 dp_list, auc_list, pc_list = zip(*results) # 转换成numpy数组(方便后续分析) dp = np.array(dp_list) AUC = np.array(auc_list) Pc = np.array(pc_list)
内容的提问来源于stack exchange,提问作者Erickzhou
相关产品推荐
相关产品推荐

