Python 为什么ThreadPoolExecutor比for循环慢? 代码1

Python 为什么ThreadPoolExecutor比for循环慢? 代码1,python,numpy,python-multithreading,concurrent.futures,Python,Numpy,Python Multithreading,Concurrent.futures,这是我为执行前馈而编写的原始代码。我想使用多线程来提高执行速度,所以我编辑了代码,使用concurrent.futures模块中的ThreadPoolExecutor 代码2 变量d是一个向量,我使用了np.tile()以便executor.map正确地获取输入 计时后,将同时调整这两个选项的执行速度。我发现代码1比代码2快得多(代码2几乎慢8-10倍)。但是,使用多线程的代码不是比它的循环对应物更快吗。是因为我写的代码是错误的还是因为其他原因。如果是因为我代码中的错误,有人能告诉我我做错了什么

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

代码2 变量
d
是一个向量,我使用了
np.tile()
以便
executor.map
正确地获取输入

计时后,将同时调整这两个选项的执行速度。我发现代码1比代码2快得多(代码2几乎慢8-10倍)。但是,使用多线程的代码不是比它的循环对应物更快吗。是因为我写的代码是错误的还是因为其他原因。如果是因为我代码中的错误,有人能告诉我我做错了什么吗

提前感谢您的帮助。

哈里

您应该在python和线程上快速进行google搜索——值得注意的是,由于python GIL(…google it),python“线程”不会并行运行。所以,如果您上面的函数是CPU受限的,那么它实际上不会像上面那样使用python线程运行得更快

要真正并行运行,需要改用ProcessPoolExecutor——这绕过了线程中存在的python“GIL锁”


至于为什么它的运行速度可能慢8-10倍——一个想法是,当您使用futures时,当您向执行者发出带有参数的调用时,futures将整理您的参数以传递给workers,然后workers将在线程/进程中取消pickle以在那里使用。(如果这对您来说是新的,请在python pickle上快速搜索一下)

如果您有大小不平凡的参数,这可能需要大量时间

所以这可能就是你看到经济放缓的原因。。。我发现我自己的代码速度大幅放缓,因为我试图将大型参数传递给工作人员

def feedforward(self,d):
    out = []
    for neuron in self.layer:
        out.append(neuron.feedforward(d))
    return np.array(out)
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)