【问题标题】:Unexecuted line executes - Numba未执行的行执行 - Numba
【发布时间】:2021-02-14 12:47:25
【问题描述】:
@jit(nopython=True)
def f1(x, y):
    #if y is None:
    #    y = x
    y[0] = 0
    x[0] = 0
    return x

@jit(nopython=True)
def f2(x, y):
    if y is None:
        y = x
    #y[0] = 0
    x[0] = 0
    return x

x = np.zeros(5, dtype='complex128')
f1(x, x.real)
f2(x, x.real)

如果我们在f1f2 中取消注释,则会引发以下错误。请注意,y 永远不会是 None,因此 y = x 永远不应执行。此外,无论是否未注释,以下都不会失败:

f1(x, x)
f2(x, x)
f1(x.real, x.real)
f2(x.real, x.real)

是我遗漏了什么,还是 Numba 错误?


  File "<ipython-input-117-a1d860b39413>", line 1, in <module>
    f2(x, x.real)
  File "D:\Anaconda\lib\site-packages\numba\core\dispatcher.py", line 415, in _compile_for_args
    error_rewrite(e, 'typing')
  File "D:\Anaconda\lib\site-packages\numba\core\dispatcher.py", line 358, in error_rewrite
    reraise(type(e), e, None)
  File "D:\Anaconda\lib\site-packages\numba\core\utils.py", line 80, in reraise
    raise value.with_traceback(tb)

TypingError: Cannot unify array(float64, 1d, A) and array(complex128, 1d, C) for 'y.2', 
defined at <ipython-input-115-c97d2a6dc56c> (13)

File "<ipython-input-115-c97d2a6dc56c>", line 13:
def f2(x, y):
    <source elided>
        y = x
    y[0] = 0
    ^
During: typing of assignment at <ipython-input-115-c97d2a6dc56c> (13)

【问题讨论】:

    标签: python python-3.x numpy jit numba


    【解决方案1】:

    简单的解决方法是用 Python 函数包装 Numba 函数:

    def f1(x, y=None):
        if y is None:
            y = x
        assert isinstance(x, np.ndarray) and isinstance(y, np.ndarray)
        return _f1(x, y)
    
    @njit
    def _f1(x, y):
        ...
    

    【讨论】:

      【解决方案2】:

      您不能在numba.jitnonpython=True 中执行此操作,因为python 程序将被编译(就像c 代码一样),并且必须是可运行的。与在运行时评估的python代码不同,编译后的代码必须提前评估,编译器无法猜测y是否为None

      要解决此问题,您可以删除 nonpython=True(或将其设置为 False

      @jit(nopython=False)
      def f1(x, y):
          #if y is None:
          #    y = x
          y[0] = 0
          x[0] = 0
          return x
      
      @jit(nopython=False)
      def f2(x, y):
          if y is None:
              y = x
          #y[0] = 0
          x[0] = 0
          return x
      
      x = np.zeros(5, dtype='complex128')
      f1(x, x.real)
      f2(x, x.real)
      

      但是使用@jit 有什么意义,因为它会退回到代码的非编译版本,没有速度增益?因此,您应该重新考虑代码的设计,或者在没有 @jit 装饰器的情况下使用它,因为在这种情况下它是无用的。

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 2020-07-13
        • 2022-08-19
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        相关资源
        最近更新 更多