我已通读 文档,但不明白以下内容的含义: 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 知识充其量不过,很可能我遗漏了一些基本知识。任何指向正确方向的指针将不胜感激
原文由 orrymr 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我们看看如果我们简单地写下会发生什么,事情可能会变得更清楚
在这种情况下,可以更自然地表达为:
Parallel
实例n_jobs=8
[getHog(i) for i in allImages]
Parallel
实例有什么问题?当列表传递给
Parallel
对象时,所有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)
而不是上面的序列,现在会发生以下情况:创建了一个
Parallel
实例n_jobs=8
名单
被创建,评估到
该列表传递给
Parallel
实例Parallel
实例创建 8 个线程并将列表中的元组分发给它们最后,这些线程中的每一个都开始执行元组,即,它们调用第一个元素并将第二个和第三个元素解压为参数
tup[0](*tup[1], **tup[2])
,将元组转回我们实际打算执行的调用,getHog(img2)
。