2013-12-18 3 views
3

Я пытаюсь Cython ускорить некоторый класс. Но я все еще хочу, чтобы код работал в чистом Python.Cython и массивы

Как определить массив в классе (код упрощен)

import cython 

class A: 
    def __init__(self): 


     if cython.compiled: 

      # This will work in Cython 
      for k in len(self.S): 
       self.S[k]=k 

     else: 
      # This will work in interpreter 
      self.S=range(8) 

    def test(self): 
     self.S[0]+=1 

И в .pxd:

import cython 

cdef class A 
    cdef int[8] S 

    cdef test(self) 

Но Cython жалуется на компиляции:

Cannot convert Python object to 'int [8]' 
+0

Просто комментарий, непосредственно не связанные с вашим вопросом, но если вы хотите 'Cython-compiled' часть чтобы полностью использовать ускорение Cython, вы всегда должны «cdef» ваши переменные приращения: 'cdef k' ... –

+1

Моя цель состояла в том, чтобы ускорить метод тестирования. который (в более упрощенной версии более сложный) называется миллионы раз, а __init__ - только один раз, –

+0

Конечно, я получил это. Это было очень общее замечание, адресованное другим людям, которые восприимчивы к чтению этой темы. Cheers;) –

ответ

2

я, наконец, получил его на работу:

import array 

class A: 
    def __init__(self): 

     # This will work in Cython 
     self.S=array.array("l", range(8)) 

    def test(self): 
     self.S[0]+=1 

И .pxd:

cimport cpython.array 

cdef class RC4: 
    cdef int [:] S 
    cdef int next(self) 
0

Это связано с тем, что синтаксис неправильный, более похожий:

cdef int S[8] 

Кроме того, нет необходимости в import cython.

Это фактически определено в самом начале documentation for cython.

+0

Нет. Сообщение об ошибке не изменяется. Кажется, проблема заключается в том, что я должен как-то инициализировать self.S в чистом Python, не вызывая конфликта типа во время компиляции (или для Cython игнорировать случай else). Мой код работал без инициализатора CPython в Cython –

+0

@RuedigerJungbeck Попробуйте создать отдельный файл, где единственное, что вы делаете, это сделать 'cdef int S [8]' и посмотреть, может ли cython распознать это, поскольку я на 100% убедитесь, что приведенный выше синтаксис верен. –

+0

@RuedigerJungbeck. Мой совет - держать цитон полностью отделенным от Python и просто импортировать нужные вам функции или классы. Я говорю это, потому что у cython есть много причуд, и большинство из них происходит, когда вы пытаетесь использовать их слишком много. Также вы можете попробовать использовать 'cpdef' вместо' cdef'. –

Смежные вопросы