用 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 特定的问题。
