使用numpy或numba的并行处理

wr98u20j  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(261)

我有一个简单的问题。一个函数接收一个包含两个数字的数组[a,b],然后返回另一个数组[a * a,a * b]。

import numpy as np

def func(array_1):
    array_2 = np.zeros_like(array_1)
  
    array_2[0] = array_1[0]*array_1[0]
    array_2[1] = array_1[0]*array_1[1]
    
    return array_2

array_1 = np.array([3., 4.])                 # sample test array [a, b]

print(array_1)                               # prints this test array [a, b]           
print(func(  array_1  ) )                    # prints [a*a, a*b]

函数func中的两行

array_2[0] = array_1[0]*array_1[0]
    array_2[1] = array_1[0]*array_1[1]

是独立的,我想并行化它们。
请告诉我
1.如何并行化(没有Numba)?
1.如何(与Numba)并行?

bmp9r5qi

bmp9r5qi1#

使用多个线程/进程并行化此代码没有意义,因为阵列太小,这种并行化无法发挥作用。实际上,在主流机器上创建线程通常需要1-100微秒,而在Numba中此代码显然需要不到1微秒的时间。实际上,两条计算线需要不到0.01微秒的时间。因此,创建线程将使执行速度慢得多。
假设你的数组要大得多,并行化Python脚本的典型方法是使用多处理(创建进程),对于Numba代码,它是prange + parallel=True(创建线程)。
如果你执行一个jited Numba函数,那么代码已经并行运行了一段时间。实际上,现代主流处理器已经并行执行指令了。这被称为instruction-level parallelism。更具体地说,现代处理器流水线化指令,并且由于超标量执行而以无序方式执行多个指令。所有这些都是完全自动的。您只需要避免在执行的指令之间存在依赖关系。
最后,如果你想加快这个函数的速度,那么你需要在调用函数中使用Numba,因为从CPython调用一个函数要比计算和存储两个float的开销大得多。还要注意的是,分配一个数组的开销也很大,所以最好在这个粒度上重用缓冲区。

相关问题