web-dev-qa-db-ja.com

クラスのメンバー関数でnumbaを使用するにはどうすればよいですか?

Numba 0.30.1の安定版を使用しています。

私がすることができます:

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タイプを使用しますか?メンバー変数にアクセスする必要があるため、この関数をクラス内に配置する必要があります。

17
dbrane

私は非常に似た状況にあり、クラス内でNumba-JITed関数を使用する方法を見つけました。

トリックは、静的メソッドを使用することです。この種のメソッドは、オブジェクトリストを引数リストの前に付加することを呼ばないためです。 selfにアクセスできないことの欠点は、メソッドの外部で定義された変数を使用できないことです。したがって、selfにアクセスできる呼び出しメソッドから静的メソッドにそれらを渡す必要があります。私の場合、ラッパーメソッドを定義する必要はありませんでした。 JITコンパイルするメソッドを2つのメソッドに分割する必要がありました。

あなたの例の場合、解決策は次のようになります:

from numba import jit

class MyClass:
    def __init__(self):
        self.k = 1

    def calculation(self):
        k = self.k
        return self.complicated([1,2,3],k)

    @staticmethod
    @jit(nopython=True)                             
    def complicated(x,k):                                  
        for a in x:
            b = a**2 .+ a**3 .+ k
23
Marduk

いくつかのオプションがあります。

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

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

    def complicated(self,x):                                  
        _complicated(x, self.k)
9
JoshAdel