2017-10-18 190 views
1

在python中使用numba.jit如何在方法中使用numba.jit

我可以正常功能轉換爲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()) 

P.S.我也嘗試裝飾器,它的工作原理,但我不能用於導入類(我不定義自己),所以我正在研究這一點。

回答

0

不能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,即時編譯),但它要求你輸入的屬性:

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。在我的經驗,最好的辦法是簡單地從方法中調用即時編譯功能:

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_*功能...

相關問題