stackoverflow.com/questions/30631091/...

ужно получить представление о производительности, которую можно получить, используя Cython в высокопроизводительном числовом коде. Одна вещь, которая меня интересует, это выяснить, может ли оптимизирующий компилятор C векторизовать код, сгенерированный Cython. Поэтому я решил написать следующий небольшой пример:

import numpy as np
cimport numpy as np
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
cpdef int f(np.ndarray[int, ndim = 1] f):
    cdef int array_length =  f.shape[0]
    cdef int sum = 0
    cdef int k
    for k in range(array_length):
        sum += f[k]
    return sum

Я знаю, что есть функции Numpy, которые делают эту работу, но я хотел бы иметь простой код, чтобы понять, что возможно с Cython. Оказывается, код, сгенерированный с помощью:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize("sum.pyx"))

и позвонил с:

python setup.py build_ext --inplace

генерирует код C, который выглядит следующим образом для цикла:

for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2 += 1) {
  __pyx_v_sum = __pyx_v_sum + (*(int *)((char *) 
    __pyx_pybuffernd_f.rcbuffer->pybuffer.buf +
    __pyx_t_2 * __pyx_pybuffernd_f.diminfo[0].strides)));
}

Основная проблема с этим кодом заключается в том, что компилятор не знает во время компиляции, что__pyx_pybuffernd_f.diminfo[0].strides таков, что элементы массива находятся близко друг к другу в памяти. Без этой информации компилятор не может эффективно векторизоваться.

Есть ли способ сделать такую вещь из Cython?

Ответы на вопрос(1)

Ваш ответ на вопрос