一个多返回值函数的joblib并行处理

Doc*_* Pi 5 python parallel-processing return-value multiprocessing joblib

我使用 joblib 来并行化一个函数(使用多处理)。但是,这个函数返回 4 个值,但是当我从 Parallel 得到结果时,它只给了我 3 个值

from joblib import Parallel, delayed 
import numpy as np
from array import array
import time

def best_power_strategy():
    powerLoc = {0}
    speedLoc = {1}
    timeLoc = {2}
    previousSpeedLoc = {3}        
    return powerLoc,speedLoc,timeLoc,previousSpeedLoc

if __name__ == "__main__":
    realRiderName=['Rider 1', 'Rider 2', 'Rider 3']
    powerLoc = {}
    speedLoc = {}
    timeLoc = {}
    previousSpeedLoc = {}
    powerLoc,speedLoc,timeLoc,previousSpeedLoc = Parallel(n_jobs=3)(delayed(best_power_strategy)() for rider in realRiderName)
    print(powerLoc)
    print(speedLoc)
    print(timeLoc)
    print(previousSpeedLoc)
Run Code Online (Sandbox Code Playgroud)

结果是:

ValueError: not enough values to unpack (expected 4, got 3)
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?

提前致谢

zwe*_*wer 8

如果要将结果存储在四个单独的名称中,可以将生成器中的结果压缩在一起,然后将它们扩展为所需的名称,即:

# shortening the names for simplicity/readability
riders = ["Rider 1", "Rider 2", "Rider 3"]
p, s, t, pv = zip(*Parallel(n_jobs=3)(delayed(best_power_strategy)() for r in riders))
Run Code Online (Sandbox Code Playgroud)

这将导致p包含所有powerLoc结果,s包含所有speedLoc结果等等......

现在,鉴于您的best_power_strategy功能基本上是静态的并且没有任何变化(您甚至没有向它发送骑手),这段代码非常无用,因为您将始终获得相同的结果,但我认为您正在使用它这只是一个例子。


Doc*_* Pi 4

好的,我已经解决了问题:

from joblib import Parallel, delayed 
import numpy as np
from array import array
import time

def best_power_strategy():
    powerLoc = {0}
    speedLoc = {1}
    timeLoc = {2}
    previousSpeedLoc = {3}

    return powerLoc,speedLoc,timeLoc,previousSpeedLoc

if __name__ == "__main__":
    realRiderName=['Rider 1', 'Rider 2', 'Rider 3']
    powerLoc = {}
    speedLoc = {}
    timeLoc = {}
    previousSpeedLoc = {}
    res = Parallel(n_jobs=3)(delayed(best_power_strategy)() for rider in realRiderName)
    powerLoc=[item[0] for item in res]
    speedLoc=[item[1] for item in res]
    timeLoc=[item[2] for item in res]
    previousSpeedLoc=[item[3] for item in res]

    print(powerLoc)
    print(speedLoc)
    print(timeLoc)
    print(previousSpeedLoc)
Run Code Online (Sandbox Code Playgroud)

  • 这只是一个MWE,当然真正的代码要复杂得多 (3认同)