Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加速python的执行?多处理不起作用_Python_Multiprocessing - Fatal编程技术网

如何加速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)