Cython/python-cdef类列表
我正在尝试改进此使用列表类型的代码:Cython/python-cdef类列表,python,list,class,cython,Python,List,Class,Cython,我正在尝试改进此使用列表类型的代码: # CLASS ORDERC # ################ cdef class OrderC: cdef int _side cdef float _px cdef int _vo def __cinit__(self, int side, float px, int vo): # .... cdef setData(self, double[:] dates): # ..
# CLASS ORDERC #
################
cdef class OrderC:
cdef int _side
cdef float _px
cdef int _vo
def __cinit__(self, int side, float px, int vo):
# ....
cdef setData(self, double[:] dates):
# ....
# CLASS LISTORDERC #
####################
cdef class ListOrderC:
cdef int _B
cdef list _LO_Bid
cdef double[:] _dates
def __init__(self, num.ndarray[num.double_t, ndim=1] dates):
self._B = 0
self._LO_Bid = []
self._dates = dates
cpdef addOrder(self, OrderC oo):
self._B += 1
self._LO_Bid.append(oo)
self._LO_Bid[-1].setData(self._dates)
当我从python调用addOrder时,问题出现了:
AttributeError: 'OrderC.OrderC' object has no attribute 'setData'
我想这是因为OrderC被识别为python对象,所以我必须用cpdef定义setData。但我希望OrderC被识别为cdef类,以提高性能
你能帮帮我吗
谢谢问题是
列表
只保存对象
类型的东西,因此当您访问时,您会返回一个对象
你可能想使用C++ <代码>向量 >,
在你所发布的代码中,方法没有正确缩进。您只需定义一个自由函数setData()
,独立于OrderC
。你需要像普通Python类一样格式化这些类。是的,这只是一个错误。在我的代码中,缩进是正确的。在列表中查找类时,我对这篇关于AttributeErrors
的帖子进行了更正:我想知道cdef OrderC OrderC=self.\u lou_Bid[-1]
和OrderC.setData(…)
是否有效?可能有效,但速度也可能较慢,因为它必须检查类型匹配,然后解包。您可以执行未经检查的强制转换,但即使这样,向量
也会更快。Sebdel的解决方案可以工作,但执行速度比我当前的解决方案慢一点。Cython不允许我编译OrderC指针的向量cdef vector,但不允许编译cdef公共向量。因此,我认为它会减慢我的代码速度,因为每次我从python访问它时,我都必须将它转换为python对象。如果您也想从python快速访问它,您可以使每个OrderC
storeobject
指针指向自身,并在从python访问时返回这些指针。不能保证它能用,但我不明白为什么不能。