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