2017-04-11 2 views
1

ここに例があります。パフォーマンスを完全に破壊することなくNumbaのリストを変更するには?

import timeit 
import numba 

@numba.njit('void(List(intp, True))') 
def foo(v): v[0] += 1 

a = range(1 << 25) 
start = timeit.default_timer() 
foo(a) 
stop = timeit.default_timer() 
print stop - start 

を明らかにNumbaが前後にリストをコピーしている:あなたはこのコードを実行した場合、それはfooを呼び出すために〜1秒のオーダーにかかったことを印刷します。それを避ける方法はありますか?
(NumPy配列を簡単に使用することはできません。私のコードでリストをサイズ変更可能にする必要があります)

+0

なぜあなたはこれをやっていますか?モチベーションは何ですか? – Veedrac

+0

@Veedrac:どういう意味ですか?固定サイズではないリストが必要なシナリオは想像できませんか? – Mehrdad

答えて

1

Numbaで実際にリストを使用する必要があり、オブジェクトモードでこの関数をコンパイルする必要があります。 nopythonモードはリスト上で直接操作することはできません。これは基本的にPythonのオブジェクト操作です.nopythonモードでは禁止されています。

+0

それはNumbaを使用するポイントを倒すことはありませんか?関数の全ポイントはリスト上で動作するので、Pythonモードで正しく動作させると速くなることはありません。これを行う方法は本当にありませんか? – Mehrdad

+0

@Mehrdad:Numbaはいくつかのループジッチングを行うことができます(http://numba.pydata.org/numba-doc/dev/glossary.html#term-loop-jitting)(あなたの例では不可能です) 'PyList_GetItem'や' PyList_SetItem'のような呼び出しを使ってダイナミックなディスパッチを避けることができます(私はその方法を知っているかどうかわかりませんが)。通常のPython関数に比べて利点はないと思われます。 – user2357112

+0

私はCythonがこれをより良くすることができると思います。例えば、私はCythonがPython標準ライブラリ 'array'モジュールとのより良い相互運用性を提供すると考えています。これはリストとNumPy配列の間の並べ替えで、ユースケースに適しています。 – user2357112

関連する問題