You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numba含默认参数函数性能异常:传参方式与参数配置影响耗时

Numba @nb.njit装饰器函数参数配置对性能的显著影响

在使用Numba的@nb.njit装饰器实现函数时,发现默认参数的取值、参数类型顺序以及传参方式(*args和**kwargs)会导致函数耗时出现数量级差异——从几十纳秒到几十微秒不等。该现象在Numba 0.58.0(Python 3.11.5)与Numba 0.57.1(Python 3.10.12)版本中均存在。

测试函数定义

import numba as nb

@nb.njit
def function(a, b, c, d=1.49012e-8, e=1.49012000000001e-8, f=0.0, g=None):
    ...
        
@nb.njit
def function2(a, b, c, d=1.49012e-8, e=1.49012000000001e-8, f=0.0):
    ...
        
@nb.njit
def function3(a, b, c, d=1.49012e-8, e=1.49012000000001e-8, f=None, g=0.0):
    ...

@nb.njit
def function4(a, b, c, d=1.49012e-8, e=1.49012e-8, f=0.0, g=None):
    ...

性能测试代码

d = 1.49012e-8
e = 1.49012000000001e-8
f = 0.0
g = 1000

args = (d, e, f, g)
kwargs = {'d': d, 'e': e, 'f': f, 'g': g}

def time_func(func, args, kwargs):
    func(1, 2, 3)
    
    print(func.__name__)
    print("time *args")
    for i, _ in enumerate(args):
        func(1, 2, 3, *args[:i])
        %timeit -n 1000 func(1, 2, 3, *args[:i])
    print("time **kwargs")
    for i in kwargs:
        _kwargs = {k: v for k, v in kwargs.items() if k != i}
        func(1, 2, 3, **_kwargs)
        %timeit -n 1000 func(1, 2, 3, **_kwargs)

time_func(function, args, kwargs)
time_func(function2, args[:-1], {k: v for k, v in kwargs.items() if k != 'g'})
time_func(function3, args, kwargs)
time_func(function4, args, kwargs)

测试输出结果

function
time *args
26.3 µs ± 425 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
25.4 µs ± 266 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
24 µs ± 175 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
241 ns ± 4.94 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
time **kwargs
235 ns ± 2.03 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
23.7 µs ± 62.6 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
23.3 µs ± 203 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
241 ns ± 5.25 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
function2
time *args
24.1 µs ± 115 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
23.3 µs ± 172 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
22.1 µs ± 428 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
time **kwargs
210 ns ± 1.31 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
22.6 µs ± 97.4 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
21.9 µs ± 98.5 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
function3
time *args
26.3 µs ± 149 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
25.2 µs ± 81.4 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
24 µs ± 160 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
23.3 µs ± 416 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
time **kwargs
237 ns ± 4.64 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
25 µs ± 290 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
255 ns ± 12.5 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
24.2 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
function4
time *args
26.2 µs ± 238 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
25.1 µs ± 95.6 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
24.1 µs ± 250 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
240 ns ± 5.87 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
time **kwargs
231 ns ± 11.9 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
233 ns ± 3.1 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
23.4 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
230 ns ± 3.43 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

内容的提问来源于stack exchange,提问作者Nin17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:07:19