2016-06-11 14 views
6

私はいくつかのコードを最適化するためにnumbaを試みています。私は、0.26.0ユーザーガイド(http://numba.pydata.org/numba-doc/0.26.0/user/jit.html)のセクション1.3.1の最初の例を試して、予想される結果を得ました。問題はインストールではないと思います。python numba指紋エラー

は、ここに私のコードです:

import numba 
import numpy 
import random 

a = 8 
b = 4 

def my_function(a, b): 
    all_values = numpy.fromiter(range(a), dtype = int) 
    my_array = [] 
    for n in (range(a)): 
     some_values = (all_values[all_values != n]).tolist() 
     c = random.sample(some_values, b) 
     my_array.append(sorted([n] + c)) 
    return my_array 

print(my_function(a, b)) 

my_function_numba = numba.jit()(my_function) 

print(my_function_numba(a, b)) 

どのmy_functionの呼び出しから期待される結果をプリントアウトした後、次のエラーメッセージが返されます:空のリストの

ValueError        Traceback (most recent call last) 
<ipython-input-8-b5d8983a58f6> in <module>() 
    19 my_function_numba = numba.jit()(my_function) 
    20 
---> 21 print(my_function_numba(a, b)) 

ValueError: cannot compute fingerprint of empty list 

指紋を?

答えて

3

一般的に、高速であることがわかりますnumbaには、numpy/pythonの特定のサブセットが必要です(詳細はherehereを参照してください)。だから私はこのように書き直すかもしれない。

@numba.jit(nopython=True) 
def fast_my_function(a, b): 
    all_values = np.arange(a) 
    my_array = np.empty((a, b + 1), dtype=np.int32) 
    for n in range(a): 
     some = all_values[all_values != n] 
     c = np.empty(b + 1, dtype=np.int32) 
     c[1:] = np.random.choice(some, b) 
     c[0] = n 
     c.sort() 
     my_array[n, :] = c 
    return my_array 

注意すべき主な事柄:

  1. なしリスト、私はすべてを事前に割り当てることです。
  2. 発電機の不使用は、(両方のpythonで2 が速いネイティブループに変換されます)
  3. デコレータにnopython=Trueを追加し、私は効率的にJITedすることができないものを使用している場合、それはそうnumbaが文句を言うことができます。
+0

素晴らしい、多くのありがとう。そして私は91.3マイクロ秒から12マイクロ秒になりました。なぜc = np.empty(b + 1、dtype = np.int32)で、c = np.empty(a、dtype = np.int32)ではないのか? – zazizoma

+0

'c'の長さが' b'のコードでは、追加する前に '[n]'を追加するので、正しい形だと思いますか? – chrisb

+0

再度、感謝します! – zazizoma