我已经阅读了文档,但是我不明白这是什么意思: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)
这将返回我的HOG功能,如我所愿(以及使用所有8个内核的速度增益),但是我不确定它的实际作用。
我的Python知识充其量是不错的,而且我很可能缺少一些基本知识。任何朝着正确方向的指针将不胜感激
如果我们看看如果简单地写的话会发生什么,也许事情变得更清楚了。
Parallel(n_jobs=8)(getHog(i) for i in allImages)
在这种情况下,可以更自然地表示为:
Pararell
实例n_jobs=8
[getHog(i) for i in allImages]
Parallel
实例有什么问题?到列表传递给Pararell
对象时,所有getHog(i)
调用都已返回-因此,可以并行执行的任何内容!所有工作已经按顺序在主线程中完成。
我们真正想要的是告诉Python我们要使用什么参数调用哪些函数,而无需实际调用它们 -换句话说,我们想延迟执行。
这是delayed
方便我们使用清晰的语法进行的操作。如果我们想告诉Python我们foo(2, g=3)
以后要调用它,我们可以简单地编写delayed(foo)(2, g=3)
。返回的元组(foo, [2], {g: 3})
包含:
foo
2
g=3
因此,通过编写Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages)
,而不是上面的序列,现在发生以下情况:
Pararell
具有n_jobs=8
创建的实例
名单
[delayed(getHog)(i) for i in allImages]
被创建,评估为
[(getHog, [img1], {}), (getHog, [img2], {}), ... ]
该列表被传递给Parallel
实例
该Parallel
实例创建8个线程,并将列表中的元组分配给它们
最后,这些线程中的每个线程都开始执行元组,即,它们调用第一个元素,而第二个和第三个元素作为参数打包tup[0](*tup[1], **tup[2])
,将元组变回我们实际打算执行的调用getHog(img2)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句