使用 jit_module
自动模块即时编译
常见的使用模式是拥有一个包含所有需要被 jit 化的用户定义函数的整个模块。完成此任务的一个选项是手动将 @jit
装饰器应用于每个函数定义。这种方法在许多情况下是有效的,并且非常棒。然而,对于包含许多函数的大型模块,手动将每个函数定义 jit
化可能会很繁琐。针对这种情况,Numba 提供了另一种选择,即 jit_module
函数,它可以自动将模块中声明的函数替换为其 jit
化的等效函数。
需要注意的是,在以下条件下,jit_module
将 不会 影响一个函数:
已经用 Numba 装饰器(例如
jit
、vectorize
、cfunc
等)包装的函数不会受到jit_module
的影响。在调用
jit_module
的模块之外声明的函数不会自动被jit
包装。在逻辑上出现在调用
jit_module
之后的函数声明不会受到影响。
模块中的所有其他函数将自动应用 @jit
装饰器。有关示例用例,请参见以下部分。
备注
此功能供模块作者使用。jit_module
不应在包含要即时编译函数的模块上下文之外调用。
示例用法
假设我们有一个创建的Python模块,``mymodule.py``(如下所示),其中包含几个函数。其中一些函数在``mymodule.py``中定义,而其他函数则从其他模块导入。我们希望使用``jit_module``对在``mymodule.py``中定义的所有函数进行即时编译。
# mymodule.py
from numba import jit, jit_module
def inc(x):
return x + 1
def add(x, y):
return x + y
import numpy as np
# Use NumPy's mean function
mean = np.mean
@jit(nogil=True)
def mul(a, b):
return a * b
jit_module(nopython=True, error_model="numpy")
def div(a, b):
return a / b
在上面的例子中,有几点需要注意:
inc
和add
函数将被替换为它们的jit
包装的等效函数,使用 编译选项nopython=True
和error_model="numpy"
。mean
函数,因为它是在 NumPy 中定义的,而不是在mymodule.py
中定义的,所以不会被修改。mul
不会被修改,因为它已经被手动装饰了jit
。div
不会被自动jit
包裹,因为它是在调用jit_module
之后声明的。
当导入上述模块时,我们有:
>>> import mymodule
>>> mymodule.inc
CPUDispatcher(<function inc at 0x1032f86a8>)
>>> mymodule.mean
<function mean at 0x1096b8950>
API
警告
此功能是实验性的。支持的功能可能会在没有通知的情况下更改。