当使用parallel=True时,如何防止Numba对特定循环进行并行处理



我有一个这样的测试代码:

import numpy as np
from numba import njit, prange
import random

def func():
a = np.empty(0)
for i in range(10):
b = np.arange(np.random.randint(10))
a = np.concatenate((a, b))
print(len(b), ' / ', len(a))

func()

它按预期工作:

3  /  3
6  /  9
5  /  14
8  /  22
9  /  31
6  /  37
9  /  46
5  /  51
3  /  54
9  /  63

如果我通过添加@njit(parallel=True)装饰器使用Numba进行编译,它将停止工作,因为Numba将导致问题的循环并行化:

2  /  0
1  /  0
2  /  0
7  /  0
0  /  0
3  /  0
2  /  0
5  /  0
7  /  0
2  /  0

在我的实际代码中,这个函数中还有另一个循环,它使用了prange,所以我希望整个函数的parallel=True。但我不想把它用于这个循环。

如何防止这种情况发生?

我最终将这部分代码从具有parallel=True@njit’ed函数中分离出来,在这个被分解的函数中,我使用了@njit,但留下了parallel=False

这是为我做的。

最新更新