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?