如何使用方法

时间:2017-10-18 10:45:13

标签: python class jit numba function-parameter

在python中使用numba.jit

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

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())

P.S。我也尝试过装饰,但是我可以将它用于导入的课程(那些我不能自己定义的课程),所以我正在研究这个。

1 个答案:

答案 0 :(得分:7)

你不能jit 绑定方法,但你可以jit未绑定方法(但只能在对象模式下):

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模式,因此您不应期望任何合理的加速。您可以将类本身设为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,如果它更复杂,我将使用从函数方法中调用的jitted函数。就个人而言,我永远不会使用jit作为方法,因为这隐含地需要对象模式,所以jitted函数可能比unjitted函数慢。

顺便说一句:在Python中,您通常使用property代替get_*set_*函数...