我想要一個帶有NumPy成員的Cython「cdef」對象,並且能夠使用快速緩衝區訪問。理想情況下,我會做這樣的事情:對象成員的Cython緩衝區聲明
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
如果你想有多種方法訪問相同的數據,這變得真的很煩人結構 - 這似乎是一個很常見的用例,不是嗎?
有沒有更好的解決方案,不需要重新聲明每種方法內的類型?
更新工作選項鍊接http://www.mail-archive.com/[email protected]/msg05166.html – gg349 2013-08-23 09:57:40
這可能會失去表現嗎? – machen 2017-09-29 15:32:22