为什么ThreadPoolExecutor慢于for循环?

问题描述 投票:0回答:1

代码1

def feedforward(self,d):
    out = []
    for neuron in self.layer:
        out.append(neuron.feedforward(d))
    return np.array(out)

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

代码2

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慢了8-10倍)。但是使用多线程的代码难道不会比循环代码更快。是因为我编写的代码是错误的还是因为其他原因。如果是由于我的代码中的某些错误,有人可以告诉我我做错了什么吗?。

谢谢您的帮助。

python numpy python-multithreading concurrent.futures
1个回答
0
投票

哈里,

[您应该对python和线程进行快速的搜索-值得注意的是,由于python GIL(... google it),python“ threads”不会并行运行。因此,如果您的上述功能受CPU限制,那么使用python线程实际上不会更快地运行。

要真正并行运行,您需要改用ProcessPoolExecutor-它绕过了线程中存在的python“ GIL lock”。


关于为什么它可能运行8到10次slower-只是一个想法,就是当您使用期货时,当您向执行人提出参数要求的电话时,期货将使您的论点变好,以传递给工人,然后他们将在该线程/进程中解刺以在其中使用。 (如果这是您的新手,请对python酸洗进行快速Google搜索)

如果您的参数大小不重要,则可能会花费大量时间。

所以这可能就是您看到速度下降的原因。 ...我在自己的代码中看到了巨大的减速,因为我试图将大型参数传递给工作人员。

© www.soinside.com 2019 - 2024. All rights reserved.