2014-09-10 64 views
1

我試圖改善這個代碼,它使用的列表類型:用Cython /蟒蛇 - CDEF類的列表

AttributeError: 'OrderC.OrderC' object has no attribute 'setData' 

我想這是:

# 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) 

的問題,當我從蟒蛇叫addOrder到達因爲OrderC被識別爲python對象,所以我必須用cpdef定義setData。但是我希望OrderC被認爲是cdef類來提升性能。

你能幫我嗎?

感謝

+0

在您發佈的代碼中,這些方法沒有正確縮進。你只需要定義一個獨立於'OrderC'的自由函數'setData()'。你需要像正常的Python類一樣格式化類。 – sth 2014-09-10 12:53:21

+0

是的,這只是一個錯誤的帖子。在我的代碼中,縮進是正確的。我對這篇文章進行了更正。 – MiKL 2014-09-10 13:05:17

回答

1

的問題是,list只持有object型的東西,所以,當你訪問你回來的object

您可能想要改用C++ vector

+0

我想知道'cdef OrderC orderc = self._LO_Bid [-1]'和'orderc.setData(...)'是否可以工作? – sebdelsol 2014-09-11 01:13:46

+0

也許,但它也可能會變慢,因爲它必須檢查類型匹配,然後解壓縮它。你可以做未經檢查的強制轉換,但即使如此,vector也會更快。 – Veedrac 2014-09-11 02:04:15

+0

Sebdel的解決方案可以工作,但執行速度比我當前的解決方案稍慢。 Cython不讓我編譯OrderC指針的矢量cdef矢量,而不是cdef公共矢量。所以我認爲它會減慢我的代碼,因爲每次我想從python訪問它時,我都必須將它轉換爲python對象。 – MiKL 2014-09-11 08:10:36