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

问题描述 投票:2回答:1

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
python numba
1个回答
2
投票

有关高级别描述 - 请参阅docs here。这是基于我(有限!)对此的理解的复述。

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

在你的函数中,一个约束是这一行 - resultarr[i]必须是同一类型。

result += arr[i]

如果没有输入,result将是一个整数。但是在arr成为双重的背景下,统一类型的唯一无损方式是将result投射到双倍。如果你走另一条路,将arr转换为int,你就会破坏信息。

© www.soinside.com 2019 - 2024. All rights reserved.