2015-03-09 2 views
0

У меня возникли проблемы с numba при попытке запустить мой собственный код (перемещение за пределы примеров учебников). Кажется, что функция power не обрабатывается компилятором правильно, и я получаю мусор (все). Истинные результаты являются суммами р-серия, и должны дать:проблема с numba и функцией pow

2 1.64493306685 
3 1.20205690315 
4 1.08232323371 

Если вместо степенной функции я использую что-то глупое, как разделение, я получаю ожидаемый результаты, так что проблема с конкретной функцией ПР , Вместо этого пробовал использовать функцию мощности numpy, такое же странное поведение.

from numba import autojit 
from numpy import power as npow 
N=1000000 

def psum(p): 
    pval = 0.0 
    for ix in xrange(1,N): 
     pval+=pow(ix,-p) 
    return pval 

nsum = autojit()(psum) 

for p in range(2,5): 
    print p, nsum(p) 

Прежде чем кричать на мой код для не достаточно вещий, я знаю, что Psum может быть записана в виде однострочника: возвращенной суммы ([мощн (IX, -p) для IX в xrange (1 , N)])

, но кто-то еще указал, что numba не обрабатывает функции со списком.

+1

Мне нравится, что Вы рассматриваете его как «кричать на свой код», а не «кричит на вас». Первый раз я видел это различие. – HavelTheGreat

+0

Да, я не принимаю кодирование _that_ лично. –

+0

Проблема «исправлена», если я использую функцию math.pow, но я все равно утверждаю, что numba неправильно понимает стандартную функцию pow. –

ответ

1

Похоже, что numpy.power ведет себя по-разному в зависимости от типа ввода. Иные типизированные аргументы принуждаются к одному типу (например, int ->float, если один из них - int, а другой - float). Вы помещаете целые числа, поэтому вы получаете целочисленное возведение в степень (что бы это ни значило). Поместите в поплавок, и все в порядке с миром.

>>> numpy.power(2, -10) 
0 
>>> numpy.power(2., -10) 
0.0009765625 
>>> numpy.power(2, -10.) 
0.0009765625 

Другими словами, вы хотите:

pval += pow(float(ix), -p) 

Или, возможно, более эффективным будет проходить p как поплавок:

print p, nsum(float(p)) 
+0

ОК, хороший, поэтому код работает * и * значительно оптимизирован numba, если я использую (a)' numpy.power (float (ix), - p) 'или (b)' math.pow (ix, -p) '. Но мой главный вопрос остается: почему numba не обрабатывает python's pow? –

+0

@SergioLucero - У этого есть __nothing__, чтобы сделать с 'numba'.Как я уже сказал в комментарии к вашему оригинальному вопросу, все дело в том, как работает функция 'power' _numpy_. «math.pow» python всегда заставляет вводить данные в поплавки. По-видимому, numpy.power нет. Я не уверен, почему он ведет себя так же, как с целыми числами, но я полагаю, что форумы devys 'numpy', вероятно, были бы лучшим местом для такого вопроса. – mgilson

0

В Python там are a few rules on type coercion которые полезны для понимания при выполнении любой математической работы. Я считаю, что вы столкнулись с одним из них, используя встроенную функцию pow благодаря различным правилам принуждения, используя numba. (yikes!)

Вы должны обновить свой код, чтобы дать значение float, когда вам нужно делать какую-либо математику, где важна точность.

Вот код обновляется с выходом:

from numba import autojit 
N = 1000000 


def psum(p): 
    pval = 0.0 
    for ix in xrange(1, N): 
     pval += pow(float(ix), float(-p)) 
    return pval 

nsum = autojit()(psum) 

for p in range(2, 5): 
    print p, nsum(p), psum(p) 

Выход python tests.py:

2 1.64493306685 1.64493306685 
3 1.20205690315 1.20205690315 
4 1.08232323371 1.08232323371 
Смежные вопросы