2016-06-11 25 views
6

Sto tentando di numba per ottimizzare del codice. Ho analizzato gli esempi iniziali nella sezione 1.3.1 nella guida per l'utente 0.26.0 (http://numba.pydata.org/numba-doc/0.26.0/user/jit.html) e ho ottenuto i risultati previsti, quindi non penso che il problema sia l'installazione.python numba fingerprint error

Ecco il mio codice:

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

che dopo la stampa i risultati attesi dalla chiamata my_function restituisce il seguente messaggio di errore:

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 

impronte digitali di lista vuota?

risposta

3

io non sono sicuro di questo errore, in particolare, ma in generale, per essere veloce numba richiede un particolare sottoinsieme di NumPy/python (vedi here e here per più). Quindi potrei riscriverlo in questo modo.

@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 

cose principali da notare:

  1. alcuna lista, io sono tutto pre-assegnazione.
  2. senza uso di generatori (sia in Python 2 otterrà convertito in un loop nativo veloce)
  3. aggiungendo nopython=True al decoratore lo rende così numba si lamenterà se uso qualcosa che non può essere efficacemente JITed.
+0

Eccellente, molte grazie. E sono passato da 91,3 microsecondi a 12 microsecondi. Qualsiasi motivo per cui c = np.empty (b + 1, dtype = np.int32) e non c = np.empty (a, dtype = np.int32)? – zazizoma

+0

Nel tuo codice sopra 'c' è length' b', quindi aggiungi '[n]' ad esso prima di accodare, quindi penso che sia la forma giusta? – chrisb

+0

Sì. Grazie ancora! – zazizoma

Problemi correlati