Skip to main content
 首页 » 编程设计

python之为什么 numba 和 numpy 在就地操作上表现不同

2025年05月04日22unruledboy

用 numba njit 修饰的函数,它是 jit(nopython=True) 的别名,会产生不同的结果来自 numpy 的就地操作(简单的 @jit(nopython=False) 也给出来自 的不同结果numpy):

In [1]: import numpy as np 
        from numba import njit 
 
        def npfun(arr): 
            arr -= arr[3] 
 
        @njit 
        def jitfun(arr): 
            arr -= arr[3] 
 
        arr1 = np.ones((6,2)) 
        arr2 = arr1.copy() 
 
        npfun(arr1) 
        jitfun(arr2) 
 
        arr1 == arr2 
 
Out[1]: array([[ True,  True], 
               [ True,  True], 
               [ True,  True], 
               [ True,  True], 
               [False, False], 
               [False, False]], dtype=bool)   

看起来 numpy 评估 rhs 并将其作为副本传递,而 numba 将 rhs 视为看法。这样做有什么技术原因吗?

numpy 1.13.3 numba 0.35

请您参考如下方法:

你正在做的操作:

arr -= arr[3] 

曾经是 NumPy 中的未定义行为。它最近才被定义,在 NumPy 1.13.0 中, 发布 June 7th this year .新定义的行为总是表现得好像它复制了所有输入,尽管它会在检测到不需要时尝试避免实际制作副本。

看起来 Numba 目前并没有尝试模仿新行为,要么是因为它有多新,要么是因为 Numba 特定的问题。