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
答案 0 :(得分:2)
有关高级别说明,请参阅文档here。这是基于我(有限!)对此的理解的复述。
在numba的编译过程中,有一个类型统一过程/解算器将所有内容转换为高效的低级操作。这可以根据输入产生多种功能。
在您的函数中,约束是此行 - maxMessages
和maxMessages
必须属于同一类型。
result
如果没有输入,arr[i]
将是一个整数。但是在result += arr[i]
为双精度的情况下,统一类型的唯一无损方法是将result
转换为double。如果您走另一条路,将arr
转换为int,则会破坏信息。