我已阅读文档,但我不明白其含义:
The delayed function is a simple trick to be able to create a tuple (function, args, kwargs) with a function-call syntax.
我正在使用它迭代我想要操作的列表(allImages),如下所示:
def joblib_loop():
Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages)
Run Code Online (Sandbox Code Playgroud)
这将返回我的HOG功能,就像我想要的那样(以及使用我所有8个内核的速度增益),但我只是不确定它实际上在做什么.
我的Python知识充其量是正常的,而且我很可能缺少一些基本的东西.任何指向正确方向的人都会非常感激
Nea*_*roo 35
如果我们看一下如果我们只是简单地写下会发生什么,也许事情会变得更加清晰
Parallel(n_jobs=8)(getHog(i) for i in allImages)
Run Code Online (Sandbox Code Playgroud)
Python的工作方式,getHog(i) for i in allImages创建一个列表,其中每个元素已经被评估.这意味着getHog在列表传递给Parallel对象时已经返回了所有调用,并且没有什么Parallel可以并行执行!所有的工作都已经在我们现在正在进行的线程中完成.
所以我们必须通过保留一个.)我们想要调用的函数和b.)我们想要调用函数的参数来延迟执行,但是实际上没有执行函数.
delayed对于我们来说,这是一个方便的语法.如果我们想要"保留"以后的调用foo(2, g=3),我们可以简单地调用delayed(foo)(2, g=3)并(foo, [2], {g: 3})返回元组,准备由其他人执行.
因此,在您的示例中,简而言之,会发生以下情况.
您创建了一个列表 delayed(getHog)(i)
每个都delayed(getHog)(i)返回元组(function, args, kwargs)(正如您在文档中读到的那样),在这种情况下是元组(getHog, [i], {})
先前构造的Parallel对象为列表中的每个元素创建一个新线程,并将元组分发给它们
el[0](*el[1], **el[2])或者function(*args, **kwargs)在这种情况下导致调用getHog(i).