2017-10-18 5 views
1

numba.jitをPythonで使用する。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ができます:あなたが期待するべきではありませんので、これは、nopythonモードを使用しないことを

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 

注意を合理的なスピードアップ。に

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

しかし、もっと複雑なクラスのために、それは非常に難しい(または不可能)になります:あなたは(つまり、すべてのメソッドが自動的にnopython-JITコンパイルされることを意味する)が、それはあなたが属性を入力することを必要とするクラス自体jitclass作ることができますjitclassを使用してください。私の経験では、最良の方法は、単にメソッド内からJITコンパイルされた関数を呼び出すことです:

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とjitのオーバーヘッドを補う計算上の高価なものがないので、numbaはまったく使用しません。少し複雑であれば、私はjitclassを使用し、もっと複雑な場合は、関数アプローチの中から呼び出されるjitted関数を使用します。個人的には、jitをメソッドに使用することは決してありません。なぜなら、暗黙のうちにオブジェクトモードが必要なので、おそらくjitted関数は、unjitted関数よりも遅いからです。ところで

:Pythonではあなたは、一般的にget_*またはset_*機能の代わりにproperty ...

を使用
関連する問題