web-dev-qa-db-ja.com

複数の出力とnumbaシグネチャ

些細なことかもしれませんが、出力がいくつかある場合、jitデコレータで署名を書き込む方法を考えていました。

例えば ​​:

import numba as nb

@nb.jit(['???(int32, int32, float(:,:), float(:,:))'], nopython=True)
def foo(nx, ny, a, b):
    for i in range(nx):
        for i in range(ny):
            do stuff with a & b
    return a, b

公演はどうですか? 2つの異なる関数を書く方が良いですか?

18
Ipse Lium

明示的な宣言または文字列宣言のいずれかを使用できます。

同種タイプのタプル:

@nb.jit(nb.types.UniTuple(nb.float64[:],2)(nb.float64[:]),nopython=True)
def f(a) :
    return a,a

@nb.jit('UniTuple(float64[:], 2)(float64[:])',nopython=True)
def f(a) :
    return a,a

異種タイプのタプル:

@nb.jit(nb.types.Tuple((nb.float64[:], nb.float64[:,:]))(nb.float64[:], nb.float64[:,:]),nopython=True)
def f(a, b) :
    return a, b

@nb.jit('Tuple((float64[:], float64[:,:]))(float64[:], float64[:,:])',nopython=True)
def f(a, b) :
    return a, b

ソース:私自身の実験、およびNumbaのソースコード: https://github.com/numba/numba

もちろん、DavidWによって提案されたソリューションは、正確なタイプがわからない場合の優れた回避策です。

@nb.jit(nb.typeof((1.0,1.0))(nb.double),nopython=True)
def f(a):
  return a,a
30
Jean Lescut

このニュースグループの投稿 によると、numba.typeof(<an example of your Tuple>)を使用して指定できます

例えば

import numba as nb

# I've put "nopython=True" just to demonstrate it still works
# whether you need it is your choice
@nb.jit(nb.typeof((1.0,1.0))(nb.double),nopython=True)
def f(a):
  return a,a

print f(5.0) # returns 5.0,5.0

numba.typesで指定されたコンポーネントからビルドすることもできますが、それはおそらくtypeofを使用するよりも手間がかかります。

Nopythonモードでこれを実行できるという事実は、パフォーマンスに問題がないことを示しています(タプルの解凍は、サポートされている機能として明示的にリストされています http://numba.pydata.org/numba-doc/dev/reference/pysupported.html )。ただし、実際にはパフォーマンスをテストしていません。

7
DavidW