dynamically/condionally 从纯 python、numba.jit 和 numba.cuda.jit 中选择
dynamically/condionally choosing from pure python, numba.jit and numba.cuda.jit
对装饰器进行更好的动态控制的最佳方法是什么 - 从 numba.cuda.jit
、numba.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
对装饰器进行更好的动态控制的最佳方法是什么 - 从 numba.cuda.jit
、numba.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