python - 如何通过方法使用 numba.jit

标签 python class jit numba function-parameter

使用 numba.jit在 python 。

我可以将普通函数转换为 jit 类型并运行:

from numba import jit

def sum(a, b):
    return a+b

func = jit(sum)
print(func(1, 2))

如何对方法执行此操作?像这样的东西(这不起作用,我知道为什么)。
from numba import jit

class some_class:
    def __init__(self, something = 0):
        self.number = something
    def get_num(self):
        return self.number

my_object = some_class(5)
func = jit(my_object.get_num)
print(my_object.func())

附言我也尝试过装饰器,它可以工作,但我不能将它用于导入的类(我自己没有定义的类),所以我正在研究这个。

最佳答案

你不能 jit 绑定(bind)方法,但您可以 jit 未绑定(bind)的方法(但仅限于对象模式):

from numba import jit

class some_class:
    def __init__(self, something = 0):
        self.number = something
    def get_num(self):
        return self.number
    func = jit(get_num)

my_object = some_class(5)
print(my_object.func())
# 5

请注意,这不使用 nopython模式,所以你不应该期望任何合理的加速。您可以将类(class)本身设为 jitclass (这意味着所有方法都是 nopython-jitted 自动)但它要求您键入属性:
import numba as nb

spec = [
    ('number', nb.int64),
]

@nb.jitclass(spec)
class some_class:
    def __init__(self, something):
        self.number = something
    def get_num(self):
        return self.number

my_object = some_class(5)
print(my_object.get_num())

但是对于更复杂的类,使用 jitclass 将变得非常困难(或不可能)。 .以我的经验,最好的方法是简单地从方法中调用 jitted 函数:
from numba import njit  # like jit but enforces nopython-mode!

@njit
def my_func(val):
    return val  # this example is a bit stupid, I hope your real code does more!

class some_class:
    def __init__(self, something = 0):
        self.number = something
    def get_num(self):
        return my_func(self.number)

my_object = some_class(5)
print(my_object.get_num())

这取决于您的类和/或您的方法有多复杂,应该使用哪种方法。在您的情况下,我根本不会使用 numba ,因为没有足够的计算昂贵的东西来补偿 numba 和 jit 开销。如果它更复杂一点,我会使用 jitclass如果它更复杂,我会使用从函数方法中调用的 jited 函数。就我个人而言,我永远不会使用 jit对于一个方法,因为它隐含地需要对象模式,所以很可能 jitted 函数比 unjitted 函数慢。

顺便说一句:在 Python 中,您通常使用 property而不是 get_*set_*职能...

关于python - 如何通过方法使用 numba.jit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46808362/

相关文章:

Python:什么是 header ?

python - 我正在尝试为基于文本的应用程序创建 tkinter 输出窗口

c# - 当我尝试制作自定义文本框时,密码字符不起作用

c++ - 我如何声明指向共享公共(public)接口(interface)的不同类的指针?

c++ - 应该如何设置王朝?

python - 将图像发送到 CouchDb 两次而不是 1 次

python - 如何将一个由连字符分割的复合词拆分为两个单独的词

C# 运行类型转换方法而不是实际方法

javascript - 从 Node 转储 v8 JIT 输出

angular-cli:默认使用 ng serve 进行 AoT 编译