Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cython/python-cdef类列表_Python_List_Class_Cython - Fatal编程技术网

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
store
object
指针指向自身,并在从python访问时返回这些指针。不能保证它能用,但我不明白为什么不能。