如何在Python中保存joblib并行运算的结果?
如何把joblib并行计算的结果存到变量里复用
Hey there! 其实你已经在代码里做了最关键的一步——把Parallel(...)()的结果赋值给run变量了!这个调用本身就会返回所有并行任务的结果列表,只要你把它存在变量里,后面就能随便用啦。我猜你可能是觉得结果格式不太好处理,或者之前没注意到赋值后的变量可以直接用?下面给你梳理清楚:
首先,确认变量赋值是对的
你现在的代码里,run = Parallel(...)()这行完全正确——run就是所有任务输出的集合。每个元素都是CurrentStepbyStep返回的那个长度为8的列表,对应每个任务的volt、phasediff等结果。
如果之前你没赋值直接运行Parallel(...)(),Python确实会默认打印整个结果列表,但只要赋值给变量(比如run),就不会自动打印了,除非你主动print(run)。
把结果转换成更易用的格式
如果想更方便地按字段提取数据,或者整理成和你的循环维度匹配的结构,可以试试下面的方法:
方法1:转换成NumPy结构化数组(按字段名访问)
这样你可以直接用字段名(比如totCurr)提取所有对应结果,不用记索引:
import numpy as np # 定义每个输出字段的名称和类型 result_dtype = [ ('volt', float), ('phasediff', float), ('ij1', float), ('ij2', float), ('iqp', float), ('sineCurr', float), ('cosineCurr', float), ('totCurr', float) ] # 把run列表转成结构化数组 results_struct = np.array(run, dtype=result_dtype) # 现在可以直接按字段名取数,比如提取所有的总电流 all_total_currents = results_struct['totCurr'] # 提取所有的电压值 all_voltages = results_struct['volt']
方法2:整理成和循环维度匹配的三维数组
你的任务是双重循环(先遍历steps再遍历Vdc_arr),可以把扁平的结果列表重塑成(steps, xsize, 8)的三维数组,方便按步数或电压值索引:
# 先转成普通的二维数组(每个行是一个任务的8个输出) flat_results = np.array(run) # 重塑成三维结构:(步数, 电压点数, 8个输出字段) structured_results = flat_results.reshape(steps, xsize, 8) # 举个例子:取第0步所有电压对应的总电流(totCurr是返回列表的第8个元素,索引为7) step_0_all_totcurr = structured_results[0, :, 7] # 取第20个电压值下,所有步数的相位差(phasediff是第2个元素,索引为1) vdc_20_all_phasediff = structured_results[:, 20, 1]
小提醒
loky后端是joblib默认的CPU密集型任务后端,你的选择很合适;- 如果后续不需要所有字段,可以修改
CurrentStepbyStep只返回需要的结果,减少内存占用; - 要是担心内存问题,可以考虑用
batch_size参数分批处理,但你的规模看起来不用太担心。
内容的提问来源于stack exchange,提问作者Lost In Euclids 5th Postulate
相关产品推荐
相关产品推荐

