delayed()函数的作用(在Python中与joblib一起使用时)

2024-05-19 13:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过joblib/parallel.html" rel="noreferrer">documentation,但我不明白什么是指: 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知识充其量还不错,很可能我遗漏了一些基本的东西。任何指向正确方向的指针都将非常感谢


Tags: thetoparallelishtmldocumentationfunctionbe
3条回答

我们需要一个循环来测试不同模型配置的列表。这是驱动网格搜索过程的主要函数,将为每个模型配置调用score_model()函数。通过并行评估模型配置,我们可以显著加快网格搜索过程。一种方法是使用Joblib库。我们可以用要使用的核心数定义一个并行对象,并将其设置为在硬件中检测到的分数。

定义执行者

executor = Parallel(n_jobs=cpu_count(), backend= 'multiprocessing' )

然后创建一个要并行执行的任务列表,这将是对每个模型配置的score model()函数的一次调用。

假设def score_model(data, n_test, cfg): ........................

定义任务列表

tasks = (delayed(score_model)(data, n_test, cfg) for cfg in cfg_list)

我们可以使用Parallel对象并行执行任务列表。

scores = executor(tasks)

因此,您希望能够将一组函数调用及其参数堆积起来,以便能够有效地将它们传递给调度器/执行器。Delayed是一个decorator,它接受一个函数及其参数,并将它们包装成一个对象,该对象可以放入一个列表中,并根据需要弹出。Dask有相同的东西,它部分地使用它的图形调度程序。

如果我们看看如果我们只是简单地写下

Parallel(n_jobs=8)(getHog(i) for i in allImages)

Python的工作方式,getHog(i) for i in allImages创建一个列表,其中每个元素都已经被求值。这意味着当列表被传递到您的Parallel对象时,所有的getHog调用都已经返回,并且没有任何东西可以让Parallel并行执行!所有的工作都已经在我们现在的线程中按顺序完成了。

因此,我们必须通过保留要调用的函数和要调用函数的参数来延迟执行。

这就是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. 在每个新线程上,它执行一个list元素:它调用元组的第一个元素,第二个和第三个元素作为参数el[0](*el[1], **el[2])function(*args, **kwargs)解包,在本例中,这将导致调用getHog(i)

相关问题 更多 >