这都是在jupyter笔记本中编程的,但是在“正常”的终端/空闲工作空间中我没有发现不同的结果。我发现运行此功能:
def __difference(a,b):
return abs(a,b)
始终比:
@jit(nopython=True)
def __difference_numba(a,b):
return abs(a,b)
已编译的函数,这是__difference_numba.inspect_types()的输出(两种情况下我的输入均为两个浮点数):
__difference_numba (float64, float64)
--------------------------------------------------------------------------------
# File: <ipython-input-50-f6f52d4cccbf>
# --- LINE 1 ---
# label 0
@jit(nopython=True)
# --- LINE 2 ---
def __difference_numba(a, b):
# --- LINE 3 ---
# a = arg(0, name=a) :: float64
# b = arg(1, name=b) :: float64
# $0.1 = global(abs: <built-in function abs>) :: Function(<built-in function abs>)
# $0.4 = a - b :: float64
# del b
# del a
# $0.5 = call $0.1($0.4, kws=[], vararg=None, args=[Var($0.4, <ipython-input-50-f6f52d4cccbf> (3))], func=$0.1) :: (float64,) -> float64
# del $0.4
# del $0.1
# $0.6 = cast(value=$0.5) :: float64
# del $0.5
# return $0.6
return abs(a-b)#np.abs(a - b)
=============================================================================
使用timeit计时功能的代码:
单元格定义参数(我尝试使用其他数字):
#test parameters
a=5.0
b=-2.5
用于测试numba实施和结果的单元格:
%%timeit
#test numba
__difference_numba(a,b)
239 ns ± 6.03 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
用于测试正常python实现和结果的单元格:
%%timeit
#test python
__difference(a,b)
156 ns ± 0.823 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
答案 0 :(得分:4)
我相信您所看到的是分派到numba代码的开销(而不一定是编译的abs
函数的速度),因为在函数中完成的工作非常琐碎。
通常,您不会像这样将琐碎的调用分成一个函数,尽管编译器可能会内联从另一个按数字顺序调用的函数中调用_difference_numba
。无论哪种方式,您都需要使numba代码停留的时间长于开销,才能开始看到纯python代码和numba引用的代码之间的性能差异。像这样在numba / python边界上来回调用不会克服开销。