如何加速python的执行?多处理不起作用
我正在尝试进行多重处理以加快特征提取过程。 以下是我所做的:如何加速python的执行?多处理不起作用,python,multiprocessing,Python,Multiprocessing,我正在尝试进行多重处理以加快特征提取过程。 以下是我所做的: import numpy as np from multiprocessing import Pool, Process import time def cal_feature(subject): return (np.mean((subject),axis=-1)) #multiprocessing if __name__ == '__main__': st=time.time() data_1= np
import numpy as np
from multiprocessing import Pool, Process
import time
def cal_feature(subject):
return (np.mean((subject),axis=-1))
#multiprocessing
if __name__ == '__main__':
st=time.time()
data_1= np.random.randint(0, 100, size=(300, 100, 2000))
data_2= np.random.randint(100, 200, size=(300, 100, 2000))
data_3= np.random.randint(100, 200, size=(300, 100, 2000))
data_4= np.random.randint(100, 200, size=(300, 100, 2000))
data_5= np.random.randint(100, 200, size=(300, 100, 2000))
data={1:data_1,2:data_2,3:data_3,4:data_4,5:data_5}
p=Pool(10)
parallel_result=[]
for i in data.keys():
result=p.map(cal_feature, np.split(data[i], 10))
parallel=np.concatenate((result),axis=0)
parallel_result.append(parallel)
p.close()
p.join()
print('multprocessing total time',time.time()-st)
但多处理所需的时间是串行编程的5倍。如何加快特征提取速度?这里我使用
numpy.mean
作为特征,但在实际数据集中,我有30个复杂的特征函数。我没有随机生成5个数据集,而是有80个这样的数据集。有没有一种方法可以进行健壮的特征提取?关键是每个进程都必须为每个目标进程pickle相当大的数组-这是成功的。而连续处理直接处理初始数组。使用您的输入数据,我得到连续进近的3
sec,多处理进近的6
sec
尝试中的问题:不要在每次迭代时启动pool.map
——进行一次map
调用,因为它已经意味着处理一个可重用的数据项。并且不需要拆分数据项np.split(data[i],10)
,而是将data[i]
传递给目标函数
话虽如此,为了在您的情况下从多处理方法中获得真正的性能优势,考虑到您的输入数组是如何构造的,我们需要防止对这些大容量数组进行酸洗,并将生成数组的责任转移到只需传入数组大小/形状选项的目标函数:
时间执行结果:multprocessing总时间0.6732537746429443
(相对于连续处理的3秒)
将返回所需的累积结果。不要在每次迭代时启动pool.map-进行单个map调用。不要拆分np.split(data[i],10)
,将data[i]
传递到我的系统上的目标函数这几乎不使用任何CPU,它产生了大量的进程,其中一个占用了2.3 GB的RAM,其余什么都没有。所以很明显,我没有做它应该做的。我没有得到这条线。不要在每次迭代时启动pool.map-进行单个map调用。你能解释一下吗it@TalhaAnwar,result=p.map(cal_feature,data.values())
-没有for-loop关键是每个进程必须为每个目标进程pickle相当大的数组-这很成功。而连续处理直接处理初始数组。我认为OP问题中输入数据的构造方式只是为了说明,所以你所说的并不适用于处理无法按需生成的实际输入数据。我仍在努力映射/实现这一点接近我的真实数据。让我解释一下我读到的数据。我有一本字典在磁盘中保存为npy。字典中的每个键表示数据文件(数据_1、数据_2、数据_3等),与随机生成的数据
字典相同。有80把这样的钥匙。虽然每个数据的形状都是(100,643072)
,但它们是浮点数据类型,这使得数组在size@martineau,我无法预测实际数据,我看到了输入数据并提出了一个有效的解决方案,就是它
#Serial processing
st=time.time()
data_1= np.random.randint(0, 100, size=(300, 100, 2000))
data_2= np.random.randint(100, 200, size=(300, 100, 2000))
data_3= np.random.randint(100, 200, size=(300, 100, 2000))
data_4= np.random.randint(100, 200, size=(300, 100, 2000))
data={1:data_1,2:data_2,3:data_3,4:data_4,5:data_5}
series_result=[]
series=[]
for i in data.keys():
series_result.append(cal_feature(data[i]))
print('series toal time',time.time()-st)
import numpy as np
from multiprocessing import Pool
import time
def cal_feature(start, end, size):
return np.mean(np.random.randint(start, end, size=size), axis=-1)
# multiprocessing
if __name__ == '__main__':
st = time.time()
data_shapes = [(0, 100, (300, 100, 2000)),
(100, 200, (300, 100, 2000)),
(100, 200, (300, 100, 2000)),
(100, 200, (300, 100, 2000)),
(100, 200, (300, 100, 2000))]
with Pool(10) as p:
result = p.starmap(cal_feature, data_shapes)
print('multprocessing total time', time.time() - st)