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)