2016-06-11 16 views
6

Bazı kodları optimize etmek için numba deniyorum. 0.26.0 kullanıcı kılavuzundaki (http://numba.pydata.org/numba-doc/0.26.0/user/jit.html) 1.3.1 bölümündeki ilk örneklerle çalıştım ve beklenen sonuçları aldım, bu yüzden sorunun kurulum olduğunu düşünmüyorum.python numba fingerprint hatası

İşte benim kod:

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)) 

Hangi işlevim çağrısından beklenen sonuçların basılmasına sonra aşağıdaki hata iletisini döndürür: Boş listenin

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 

Parmak İzi?

cevap

3

Ben özellikle bu hata hakkında emin değilim, ama genel olarak (daha fazlası için here ve here bakınız) numba numpy/piton belirli bir alt kümesini gerektirir hızlı olmak. Böylece bunu yeniden yazabilirim.

@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 

Ana Unutulmaması gereken:

  1. hiçbir listeler, ben önceden tahsis şeyi değilim.
  2. jeneratörlerinin hiçbir faydası dekoratör ben verimli JITed olamaz şey kullanırsanız o kadar numba şikayet edecek yapar için
  3. nopython=True ekleyerek (her ikisi piton 2 hızlı bir yerli döngüye dönüştürülen alacak).
+0

Mükemmel, çok teşekkürler. Ve 91.3 mikrosaniyeden 12 mikrosaniyeye gittim. Herhangi bir sebep neden c = np.empty (b + 1, dtype = np.int32) ve c = np.empty (a, dtype = np.int32)? – zazizoma

+0

Yukarıdaki kodda 'c' uzunluk' b', sonra eklemeden önce [[n] 'eklediniz, bu yüzden bu doğru şekil olduğunu mu düşünüyorsunuz? – chrisb

+0

Yup. Tekrar teşekkürler! – zazizoma