首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟()函数是做什么的(当与Python中的joblib一起使用时)

延迟()函数是做什么的(当与Python中的joblib一起使用时)
EN

Stack Overflow用户
提问于 2017-02-14 07:44:03
回答 4查看 34.4K关注 0票数 90

我读过文档,但我不明白The delayed function is a simple trick to be able to create a tuple (function, args, kwargs) with a function-call syntax.是什么意思

我使用它来迭代我想要操作的列表(allImages)如下:

代码语言:javascript
复制
def joblib_loop():
    Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages)

这将返回我的HOG特性,就像我想要的那样(并且使用我所有的8个核来获得速度增益),但是我不知道它到底在做什么。

我的Python知识充其量是正常的,而且很可能我缺少一些基本的东西。任何指向正确方向的指针都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-20 16:04:41

也许如果我们看看会发生什么事情就会变得更清楚,如果我们只是简单地写

代码语言:javascript
复制
Parallel(n_jobs=8)(getHog(i) for i in allImages)

在这方面,可以更自然地将其表述为:

  1. 使用Parallel创建n_jobs=8实例
  2. 为列表[getHog(i) for i in allImages]创建生成器
  3. 将生成器传递给Parallel实例

有什么问题吗?当列表被传递到Parallel对象时,所有的getHog(i)调用都已经返回了--所以没有什么可以并行执行的了!所有的工作都是按顺序在主线程中完成的。

我们真正想要的是告诉Python我们想用什么参数调用哪些函数,而不实际调用它们--换句话说,我们希望延迟执行。

这是delayed方便地允许我们做的事情,语法清晰。如果我们想告诉Python我们希望稍后调用foo(2, g=3),我们只需编写delayed(foo)(2, g=3)。返回的是元组(foo, [2], {g: 3}),包含:

  • 对我们要调用的函数的引用,例如foo
  • 没有关键字的所有参数(简称"args"),例如t 2
  • 所有关键字参数(简称"kwargs"),例如g=3

因此,通过编写Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages),而不是上面的序列,现在发生了以下情况:

  1. 创建带有Paralleln_jobs=8实例。
  2. 名单 延迟(GetHog)(I)在allImages中用于I 获取创建,计算为 [(getHog,img1,{}),(getHog,img2,{}),.]
  3. 该列表将传递给Parallel实例。
  4. Parallel实例创建8个线程,并将元组从列表分发给它们。
  5. 最后,每个线程都开始执行元组,即调用第一个元素,第二个和第三个元素解压缩为参数tup[0](*tup[1], **tup[2]),将元组转换回我们实际要做的调用getHog(img2)
票数 167
EN

Stack Overflow用户

发布于 2019-10-24 09:22:37

我们需要一个循环来测试不同型号配置的列表。这是驱动网格搜索过程的主要函数,它将为每个模型配置调用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)

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

scores = executor(tasks)

票数 2
EN

Stack Overflow用户

发布于 2018-03-25 21:52:54

因此,您想要做的是堆积一组函数调用及其参数,这样您就可以高效地将它们传递给调度程序/执行器。延迟是一个装潢工,它接收一个函数及其arg,并将它们封装到一个可以放在列表中并根据需要弹出的对象中。Dask也有同样的功能,它在一定程度上用于将其输入到图形调度程序中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42220458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档