2015-05-14 3 views
2

Пусть a и b два numpy.float массивы длиной 1024, определенные сЦикл по массиву Numpy с Cython

cdef numpy.ndarray a 
cdef numpy.ndarray b 

Я заметил, что:

cdef int i 
for i in range(1024): 
    b[i] += a[i] 

значительно медленнее, чем:

b += a 

Почему?

Мне действительно нужно уметь вручную обходить массивы.

+2

Вы читаете и следуете за http://docs.cython.org/src/tutorial/numpy.html? Я имею в виду, я сомневаюсь, что вы будете бить b + = a с точки зрения скорости, но какие скорости вы на самом деле получаете? – ballsatballsdotballs

+1

Последний по-прежнему использует собственные петли ufunc от Numpy, которые могут включать в себя ряд улучшений в зависимости от того, как был скомпилирован ваш Numpy. Первое не имеет, и еще больше пострадает от медленной индексации объектов ndarray; ссылка @ballsdotballs обсуждает это и как ее исправить. – Iguananaut

+0

Только побочный комментарий: 'cdef float x' 32-битный или 64-битный поплавок? Какой тип cdef будет работать с numpy.float32, numpy.float64? Я посмотрел на документ, но не нашел точного соответствия. – Basj

ответ

3

Разница будет меньше, если вы скажете Cython тип данных и количество измерений для a и b:

cdef numpy.ndarray[np.float64_t, ndim=1] a, b 

Хотя разница будет меньше, вы не будете бить b += a, потому что это использует NumPy SIMD-усиленные функции (которые будут работать в зависимости от того, поддерживает ли ваш процессор SIMD).

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