2016-06-11 4 views
6

Я пытаюсь numba оптимизировать некоторый код. Я рассмотрел исходные примеры в разделе 1.3.1 в руководстве пользователя 0.26.0 (http://numba.pydata.org/numba-doc/0.26.0/user/jit.html) и получил ожидаемые результаты, поэтому я не думаю, что проблема связана с установкой.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 

Fingerprint пустого списка?

ответ

3

Я не уверен, что ошибки, в частности, но в целом, чтобы быть быстрым numba требует определенного подмножества Numpy/питона (см here и here для более). Поэтому я могу переписать это так.

@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. нет использование генераторов (в обоих питона 2 не получит преобразованный к быстрой родной петли)
  3. добавления nopython=True к декоратор делает это так Numba будет жаловаться, если я использую то, что не может быть эффективно JITed.
+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

Yup. Еще раз спасибо! – zazizoma

Смежные вопросы