2016-11-23 4 views
0

Я все еще в начале, чтобы понять, как работает Cython. Этот фрагмент показывает одну из медленных частей моей программы, и мне интересно, можно ли улучшить это для цикла. Он по-прежнему выглядит как оригинальная версия Numpy, но я добавил cdef и int-conversion.Ускорение цикла в Cython

cdef Py_ssize_t i, j 
cdef double ii, jj 

for ii in np.arange(startx, endx+1, 0.1): 
    for jj in np.arange(starty, endy+1, 0.1): 
     if my_condition(ii, jj): 
      i = <int>ii 
      j = <int>jj 
      data[i, j] += 1 

Есть ли у вас рекомендации?

+0

Не похоже, чтобы вы когда-либо меняли 'ii' или' jj', и вы полностью игнорируете значения 'i' и' j' из циклов 'for'. Кроме того, использование 'np.arange' с шагом с плавающей точкой - ужасная идея, используете ли вы Cython или нет. Я бы рекомендовал 'np.linspace', но я не думаю, что Cython знает, как его оптимизировать. – user2357112

+0

Литье также является дорогостоящим в целом и также должно быть перемещено из петель, если это возможно. –

+0

В целом, этот код просто не имеет никакого смысла. – user2357112

ответ

1

Исследовать Cython пример

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

Это использует nditer раздать элементы массива.

И

https://cython.readthedocs.io/en/stable/src/userguide/memoryviews.html

, который демонстрирует использование memoryviews (и массивов C) для быстрого перебора значений.

В любом случае ваша цель - позволить cython напрямую обращаться к databuffer, а не через функции numpy.

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