delayed()函数做什么(当与Python中的joblib一起使用时)

orr*_*ymr 34 python joblib

我已阅读文档,但我不明白其含义: 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})返回元组,准备由其他人执行.


因此,在您的示例中,简而言之,会发生以下情况.

  1. 您创建了一个列表 delayed(getHog)(i)

  2. 每个都delayed(getHog)(i)返回元组(function, args, kwargs)(正如您在文档中读到的那样),在这种情况下是元组(getHog, [i], {})

  3. 先前构造的Parallel对象为列表中的每个元素创建一个新线程,并将元组分发给它们

  4. 在每个新线程上,它执行一个列表元素:它调用元组的第一个元素,第二个和第三个元素作为参数解压缩,el[0](*el[1], **el[2])或者function(*args, **kwargs)在这种情况下导致调用getHog(i).

  • @Nearoo - 像你这样的人应该成为教授/老师,并且必须像首席执行官一样获得报酬。并不是所有的老师都擅长教学,但你却擅长。感谢您的详细解释。 (12认同)
  • 我猜“Pararell”是一个拼写错误。我鸭鸭了。 (4认同)