numba如何推断字面初始化的本地人的类型?

时间:2018-03-01 21:09:02

标签: python numba

Numba做了一些很酷且令人惊讶的事情:

@jit(nopython=True, nogil=True)
def sum(arr):
    result = 0
    for i in range(len(arr)):
        result += arr[i]
    return result

使用int64数组调用时,它返回一个int。当使用float64调用时,它返回一个浮点数。

这是令人惊讶的,因为结果用文字整数0初始化 - 我认为它将决定结果的类型。为什么结果总是不是int?

这是sum.inspecttypes()说的float64数组的情况:

================================================================================
sum (readonly array(float64, 1d, C),)
--------------------------------------------------------------------------------
# File: /home/.../fast_ops.py
# --- LINE 164 --- 
# label 0
#   del $const0.1

@jit(nopython=True, nogil=True)

# --- LINE 165 --- 

def sum(arr):

    # --- LINE 166 --- 
    #   arr = arg(0, name=arr)  :: readonly array(float64, 1d, C)
    #   $const0.1 = const(int, 0)  :: int64
    #   result = $const0.1  :: float64
    #   jump 6
    # label 6

    result = 0

1 个答案:

答案 0 :(得分:2)

有关高级别说明,请参阅文档here。这是基于我(有限!)对此的理解的复述。

在numba的编译过程中,有一个类型统一过程/解算器将所有内容转换为高效的低级操作。这可以根据输入产生多种功能。

在您的函数中,约束是此行 - maxMessagesmaxMessages 必须属于同一类型。

result

如果没有输入,arr[i]将是一个整数。但是在result += arr[i] 为双精度的情况下,统一类型的唯一无损方法是将result转换为double。如果您走另一条路,将arr转换为int,则会破坏信息。