首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ThreadPoolExecutor比for循环慢?

为什么ThreadPoolExecutor比for循环慢?
EN

Stack Overflow用户
提问于 2019-11-18 16:56:56
回答 1查看 2.6K关注 0票数 3

代码1

代码语言:javascript
复制
def feedforward(self,d):
    out = []
    for neuron in self.layer:
        out.append(neuron.feedforward(d))
    return np.array(out)

这是我为执行前馈而编写的原始代码。我想提高使用多线程的执行速度,所以我从concurrent.futures模块编辑了使用concurrent.futures的代码。

代码2

代码语言:javascript
复制
def parallel_feedforward(self,func,param):
    return func.feedforward(param)

def feedforward(self,d):
    out = []
    with ThreadPoolExecutor(max_workers = 4) as executor:
        new_d = np.tile(d,(len(self.layer),1))
        for o in executor.map(self.parallel_feedforward,self.layer,new_d):
            out.append(o)
    return np.array(out)

变量d是一个向量,我使用了np.tile()以便executor.map正确地接受输入。

计时后两者的执行速度。我发现代码1明显快于代码2(代码2几乎比代码2慢8-10倍)。但是,使用多线程的代码不是比循环代码更快吗?是因为我写的代码错了,还是因为别的原因。如果是因为我的代码出错了,有人能告诉我我做错了什么吗?

谢谢你提前帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 08:45:39

哈里,

您应该在python和线程上快速运行google --特别是因为python (...google it),python的“线程”不会并行运行。因此,如果上面的功能是CPU绑定的,那么它实际上不会像上面那样使用python线程运行得更快。

要真正并行运行,您需要使用ProcessPoolExecutor,这样就可以绕过带有线程的python "GIL“。

至于为什么运行速度会慢8到10倍--一个想法是,当你使用期货时,当你向执行者发出一个带有参数的呼叫时,期货会挑选出你的论点传递给工人,然后工人们会在线程/进程中使用它。(如果这对您来说是新的,那么在python泡菜上做一个快速的google吧)

如果您的参数是非平凡的大小,这可能需要大量的时间。

所以这可能就是你看到经济放缓的原因。...I在我自己的代码中看到了巨大的放缓,因为我试图向工人传递大型的参数。

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

https://stackoverflow.com/questions/58919495

复制
相关文章

相似问题

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