2017-01-20 45 views
5

我使用穩定版的Numba 0.30.1。如何在一個類的成員函數上使用numba?

我可以這樣做:

import numba as nb 
@nb.jit("void(f8[:])",nopython=True)        
def complicated(x):         
    for a in x: 
     b = a**2.+a**3. 

的測試案例,並且增速是巨大的。但是如果我需要加快班級內部的功能,我不知道該怎麼做。

import numba as nb 
def myClass(object): 
    def __init__(self): 
     self.k = 1 
    #@nb.jit(???,nopython=True)        
    def complicated(self,x):         
     for a in x: 
      b = a**2.+a**3.+self.k 

對於self對象,我使用哪種numba類型?我需要在類內部有這個函數,因爲它需要訪問一個成員變量。

+0

什麼有關['jitclass'](http://numba.pydata.org/numba-doc/dev/user /jitclass.html)?考慮到'self'的定義是_object_,我認爲它不可能避免「object-fallback」。 – MSeifert

+0

又是什麼'b = a ** 2. + a ** 3. + self.k'要實現,因爲你在下一個循環中立即覆蓋它? – MSeifert

+0

'self.k'只是示意性地表明我需要調用成員變量,並且不能只在類之外具有該功能 – dbrane

回答

3

您有幾種選擇:

使用jitclasshttp://numba.pydata.org/numba-doc/0.30.1/user/jitclass.html)爲 「numba-IZE」 整個事情。

,或使成員函數的包裝,並通過傳遞成員變量:

import numba as nb 

@nb.jit 
def _complicated(x, k): 
    for a in x: 
     b = a**2.+a**3.+k 

def myClass(object): 
    def __init__(self): 
     self.k = 1 

    def complicated(self,x):         
     _complicated(x, self.k) 
+1

我已經在'jitclass'上看到了該頁面,但是我完全不清楚可以明確說明每個成員函數的數據類型。你能舉一個例子嗎?包裝函數的方法變得不夠優雅,並且打敗了我將事物放入類中的觀點。 – dbrane

+0

我會避免聲明參數類型的成員函數,只是Numba通過類型推理來處理它。在最近的記憶中,我不記得宣稱類型會帶來更好的表現。 https://github.com/numba/numba/tree/master/examples中有一些更復雜的jitclass示例 - 例如https://github.com/numba/numba/blob/master/examples/stack.py – JoshAdel

+0

@dbrane,因爲我知道該類的方法不能在當前版本的numba中被激發。如果試圖做到這一點很明顯的錯誤消息出現「TypeError:類成員尚不支持:複雜」。另外,我發現使用jitclass並沒有爲你的例子提供任何加速。 –

相關問題