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
有关高级别描述 - 请参阅docs here。这是基于我(有限!)对此的理解的复述。
在numba的编译过程中,有一个类型统一过程/求解器将所有内容转换为高效的低级操作。这可以根据输入产生多种功能。
在你的函数中,一个约束是这一行 - result
和arr[i]
必须是同一类型。
result += arr[i]
如果没有输入,result
将是一个整数。但是在arr
成为双重的背景下,统一类型的唯一无损方式是将result
投射到双倍。如果你走另一条路,将arr
转换为int,你就会破坏信息。