如何制作一个虚拟的什么都不做的@jit 装饰器?

How do I make a dummy do-nothing @jit decorator?

我希望 numba 成为一个可选的依赖项,以便安装时速度快,不安装时速度慢。因此,当没有安装 numba 时,我希望 @njit 成为一个什么都不做的虚拟装饰器。

如果我遵循 these directions 并使用:

def njit(func):
    return func

然后当像 @njit(cache=True, nogil=True) 这样调用装饰器时,我得到以下错误:

TypeError: njit() got an unexpected keyword argument 'cache'

如果我尝试捕获参数并使用

忽略它们
    def njit(func, *args, **kwargs):
        return func

然后我得到:

missing 1 required positional argument: 'func'

我如何制作一个什么都不做并且忽略 kwargs 的虚拟装饰器?

将带有参数的装饰器视为装饰器工厂,它们 return 是一个装饰器。这样

def decorator(func):
    return func

上面是一个装饰器,现在有参数

def decorator_factory(a,b,c):
    def decorator(func):
        return func
    return decorator

内部 decorator 可以访问 a,b,c 参数,因为它是一个闭包。希望对您有所帮助


所以可以定义为:

def njit(cache, nogil):
    def decorator(func):
        return func 
    return decorator

如果您想节省一些时间并能够对所有 numba 装饰器执行相同的操作,请尝试 numbasub。它提供的正是您所要求的,您可以将其应用到您想要的任何项目中。