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

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

Проблема в том, как вы работаете с массивами в Cython или более явно: существует ли прямой интерфейс к типу array.array 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, но кажется, что их создание очень дорого для небольших 1D-массивов по сравнению с созданием массива C с malloc (но обработка памяти становится болью).

Благодаря!

  • python webkit webview помнит файлы cookie?
  • Реализовать доступ к списку как индекс в Python
  • Как эффективно вычислить гауссовскую матрицу ядра в numpy?
  • Python: поиск файла в текущем каталоге и всех его родителей
  • Как построить два столбца кадра данных pandas с помощью точек?
  • Python MySQLdb возвращает datetime.date и decimal
  • Matplotlib 3D-цвет рассеяния, потерянный после перерисовки
  • Выполнение многострочных операторов Python в однострочной командной строке
  • One Solution collect form web for “Эффективные математические операции на небольших массивах на питоне с помощью cython”

    Вы можете свернуть свои простые с базовыми функциями и проверить здесь макет, чтобы начать:

     from libc.stdlib cimport malloc,free cpdef class SimpleArray: cdef double * handle cdef public int length def __init__(SimpleArray self, int n): self.handle = <double*>malloc(n * sizeof(double)) self.length = n def __getitem__(self, int idx): if idx < self.length: return self.handle[idx] raise ValueError("Invalid Idx") def __dealloc__(SimpleArray self): free(self.handle) cpdef SimpleArray running_sum(SimpleArray arr): cdef int i cdef SimpleArray out = SimpleArray(arr.length) out.handle[0] = arr.handle[0] for i from 1 < i < arr.length-1: out.handle[i] = out.handle[i-1] + arr.handle[i] return out 

    могут быть использованы как

     >>> import test >>> simple = test.SimpleArray(100) >>> del simple >>> test.running_sum(test.SimpleArray(100)) <test.SimpleArray object at 0x1002a90b0> 
    Python - лучший язык программирования в мире.