Эффективные математические операции на небольших массивах в python с помощью cython

Я использую numpexpr для быстрого вычисления на больших массивах, но если размер массива равен меньше, чем кеш ЦП, написание моего кода на Cython с использованием простой математики массива выполняется намного быстрее, особенно если функция вызывается несколько раз.

Проблема в том, как вы работаете с массивами в Cython, или, точнее, в том, есть ли прямой интерфейс к массиву Python. Тип массива в Cython? Я бы хотел сделать что-то вроде этого (простой пример)

cpdef array[double] running_sum(array[double] arr):
    cdef int i 
    cdef int n = len(arr)
    cdef array[double] out = new_array_zeros(1.0, n)
    ... # some error checks
    out[0] = arr[0]
    for i in xrange(1,n-1):
        out[i] = out[i-1] + arr[i]

    return(out)

Сначала я попробовал использовать оболочку Cython numpy и работал с ndarrays, но кажется, что их создание очень дорого обходится для небольших одномерных массивов по сравнению с созданием массива C с malloc (но обработка памяти становится проблемой).

Спасибо!

9
задан JoshAdel 19 March 2011 в 04:58
поделиться