当 运行 循环使用 prange from numba 对其进行并行化时,元素是否以相同的顺序附加?

When running a loop using prange from numba to parallelize it, are elements appended in the same order?

我正在使用 numba prange 来尝试并行化以下函数:

@njit(parallel=True)
def contrast_16bit(video):

    n = video.shape[0]

    #New max value
    high = 65535
    video16 = []

    for i in prange(n):
        data = video[i,:,:]
        
        #Old max and min
        vmin = np.min(data)
        vmax = np.max(data)
        #Scale factor
        scale = high/(vmax-vmin)
        
        #Scale data
        data = data - vmin
        data = scale * data
        #Append data
        video16.append(data)

我的问题是,当循环使用 prange 时,当每个数据附加到 video16 列表时,它是否保持与原始数组中相同的顺序?

因此首先附加视频中的第一个数组,依此类推。

谢谢!

至于你问的字面问题 - 不知道,老实说,如果不深入研究实现就很难知道,所以老实说,我害怕依赖这个并行操作的顺序。

但是,您可以通过分配一个数组来回避整个问题:video16 = np.empty(n, dtype=float),然后在最后一步设置 video16[i] = data!这样更安全也更容易理解。

使用 prange 时,您应该始终期待随机评估顺序。这可以很容易地检查:

@nb.njit(parallel=True)
def order():
    for value in nb.prange(5):
        print(value)

此外,如果您关心效率,请避免在事先知道最终大小的情况下使用不断增长的数据结构,因此请遵循@Perfi 的建议,预先分配数组并将每个循环结果插入其已知位置。