Python 多重处理和并行性在numpy函数中的应用

Python 多重处理和并行性在numpy函数中的应用,python,numpy,process,multiprocessing,numpy-ndarray,Python,Numpy,Process,Multiprocessing,Numpy Ndarray,我正在尝试对我的numpy代码进行并行化,以使其更快。最初的numpy数组list\uuu有超过200万个变量,因此很难计算,这就是为什么我尝试使用numpy和多处理函数计算我的计算。我如何利用下面的代码来处理多个处理单元。我在下面有一个代码,我已经尝试过多处理,但我相信它不是很有效。函数ym、xym、std是独立的,因此可以对这些函数进行多处理,但是mk、bk依赖于ym、xym、std函数 普通Python版本 import numpy as np number = 5 list_= np.a

我正在尝试对我的numpy代码进行并行化,以使其更快。最初的numpy数组
list\uuu
有超过200万个变量,因此很难计算,这就是为什么我尝试使用numpy和多处理函数计算我的计算。我如何利用下面的代码来处理多个处理单元。我在下面有一个代码,我已经尝试过多处理,但我相信它不是很有效。函数
ym、xym、std
是独立的,因此可以对这些函数进行多处理,但是
mk、bk
依赖于
ym、xym、std
函数

普通Python版本

import numpy as np
number = 5
list_= np.array([457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000])
ym = (np.convolve(list_, np.ones(shape=(number)), mode='valid')/number)[:-1]
xym = (np.convolve(list_, np.arange(number, 0, -1), mode='valid'))[:-1]
mk = (x_mean* ym- xym)/(np.power(x_mean,2)- x_squared_mean)
bk = ym - mk*x_mean
std = np.array([list_[i:i+number].std() for i in range(0, len(list_)-number)])
多处理版本

#x_mean and x_squared is used for the lin regressions and stand dev
x_mean = number/2*(1 + number)
x_squared_mean = number*(number+1)*(2*number+1)/6

def ym():   
    ym = (np.convolve(PC_list, np.ones(shape=(number)), mode='valid')/number)[:-1]
    print(ym)
def xym():
    xym = (np.convolve(PC_list, np.arange(number, 0, -1), mode='valid'))[:-1]
    print(xym)
def std():
    std = np.array([PC_list[i:i+number].std() for i in range(0, len(PC_list)-number)])
    print(std)
    
#setting up the multi processing vars     
p1 = multiprocessing.Process(target=ym)
p2 = multiprocessing.Process(target=xym)
p3 = multiprocessing.Process(target=std)

#running the multi processes 
p1.start()
p2.start()
p3.start()

p1.join()
p2.join()
p3.join()

xym()
ym()
std()

由于
mk
bk
确实依赖于
ym
xym
,因此您无能为力,您必须首先计算它们,然后才能在下一次计算中使用它们

我做了一个快速的基准测试,看起来即使我有一个2000万的数组,卷积,
mk
bk
都在0.3s下运行。代码中真正的瓶颈是
std
函数。这是因为使用python
for
循环速度很慢

努巴去营救 我的建议是调查一下。它可以将您的常规python函数编译成优化的机器代码,并使它们运行得极快!它有一些局限性,但对于您的情况来说,它将非常有效。尝试将
std
功能更改为:

from numba import njit

@njit 
def std_numba(x, n):
    std = np.array([x[i:i+n].std() for i in range(0, len(x)-n)])
    return std

即使没有任何类型的多重处理,所有的计算都在一秒钟内以200万个浮点数的随机数组运行。

谢谢你,我目前在windows 10上安装numba库时遇到了问题,但我会在安装后尽快对其进行测试。