dynamically/condionally 从纯 python、numba.jit 和 numba.cuda.jit 中选择

dynamically/condionally choosing from pure python, numba.jit and numba.cuda.jit

对装饰器进行更好的动态控制的最佳方法是什么 - 从 numba.cuda.jitnumba.jit 和 none(纯 python)中进行选择。 [请注意,一个项目可以有 10 或 100 个函数,所以这应该很容易应用到所有函数] 这是 numba 网站上的一个例子。

import numba as nb
import  numpy as np

# global control of this --> @nb.jit or @nb.cuda.jit  or none 
# some functions with @nb.jit or cuda.jit with kwargs like (nopython=True, **other_kwargs)
def sum2d(arr):
    M, N = arr.shape
    result = 0.0
    for i in range(M):
        for j in range(N):
            result += arr[i,j]
    return result


a = np.arange(81).reshape(9,9)

sum2d(a)

您可能想要更复杂的东西,但相对简单的解决方案是根据设置重新定义 jit。例如

def _noop_jit(f=None, *args, **kwargs):
    """ returns function unmodified, discarding decorator args"""
    if f is None:
        return lambda x: x
    return f

# some config flag
if settings.PURE_PYTHON_MODE:
    jit = _noop_jit
else: # etc
    from numba import jit

@jit(nopython=True)
def f(a):
    return a + 1