些細なことかもしれませんが、出力がいくつかある場合、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つの異なる関数を書く方が良いですか?
明示的な宣言または文字列宣言のいずれかを使用できます。
@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
このニュースグループの投稿 によると、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 )。ただし、実際にはパフォーマンスをテストしていません。