Объявление буфера Cython для членов объекта

Я хочу иметь объект Cython "cdef" с членом NumPy и иметь возможность использовать быстрый доступ к буферу. В идеале, я бы сделал что-то вроде:

import numpy as np
cimport numpy as np

cdef class Model:
  cdef np.ndarray[np.int_t, ndim=1] A

  def sum(self):
    cdef int i, s=0, N=len(self.A)
    for 0 <= i < N:
      s += self.A[i]
    return s

  def __init__(self):
    self.A = np.arange(1000)

К сожалению, Cython не может скомпилировать это, с ошибкой Buffer types only allowed as function local variables.

В качестве обходного пути я использую объявление атрибутов буфера в новой локальной переменной, назначенной объекту-члену:

cdef class Model:
  cdef np.ndarray A

  def sum(self):
    cdef int i, s=0, N=len(self.A)
    cdef np.ndarray[np.int_t, ndim=1] A = self.A
    for 0 <= i < N:
      s += A[i]
    return s

Это становится действительно раздражающим, если вы хотите иметь несколько методов, обращающихся к одним и тем же структурам данных - что кажется довольно распространенным случаем использования, не так ли?

Есть ли лучшее решение, которое не требует повторного объявления типов внутри каждого метода?

22
задан Brendan OConnor 10 January 2012 в 18:09
поделиться