2017-07-16 82 views
-1

,当我试图让Python的修改列表类基于一个项目,我的工作,并决定尝试用Cython用Cython的扩展模块类的方法不可见/起名错误提到

加快步伐在我第一次去,大多数类的功能(除了特殊功能)是不可见的,无法访问

我试着从cdef,cpdef和def的名称反弹的方法和类声明,并尝试使用Google搜索来查看我是否具有正确的语法以及查看是否有其他人有类似问题

这里是我的代码:

class list_2: 

     cpdef append(self , object item): 
      self._lst = array(self + [item]) 

     cpdef pop(self,int index = -1): 
      temp_lst = array(range(len(self) -1)) 

      if index > len(self)-1 and index >= 0 or index*(-1) > len(len) and index < 0: 
       raise IndexError 
      else: 
       if index <0: 
        index = index*(-1)-1 
       for x in range(len(self)): 
        if x!= index: 
         temp_lst[i] = self[x] 
         i+=1 
       self._lst = temp_lst 
+0

它看起来像你宣布你的班级为'class list_2'。你应该声明它是一个'cdef class list_2',而不是为了使它成为一个cython扩展类型。否则,cython将它视为一个普通的python类。文档中的[此链接](http://cython.readthedocs.io/en/latest/src/tutorial/cdef_classes.html)可能有助于学习有关cython类的知识。 – CodeSurgeon

+0

另外,我不确定尝试重新实现列表类是否会带给您期望的性能优势。如果你的数据都是单一类型的,你可能还想考虑使用cython的类型化内存视图或者使用C数组和指针。了解为什么你有兴趣创建一个修改过的列表类可能会有所帮助。 – CodeSurgeon

+0

@CodeSurgeon,我想我已经提到过了,我已经为类声明尝试了'cdef','cpdef'和'def',并且它们都给了我相同的结果,没有包含在类中的那些函数 老实说,我只是想让这个课程在Cython和Python中练习 您可能会有其他任何建议,我将非常感谢 –

回答

0

这里有一个简单的例子来帮助你开始使用cython类。首先,我创建了我的setup.py文件,我通过调用python setup.py build_ext --inplace来编译我的文件.pyx文件。

from distutils.core import setup 
from Cython.Build import cythonize 
from distutils.core import Extension 

extensions = [ 
    Extension("mylist", sources=["mylist.pyx"], libraries=[], extra_compile_args=["-w"]), 
] 
setup(
    ext_modules = cythonize(extensions) 
) 

接下来,我会写一个.pxd文件。就像我在评论中提到的那样,这基本上是一个头文件,它定义了您想要访问的所有“c-side”类属性和方法,这些属性使用cdefcpdef定义。一个例子mylist.pxd应该是这样的:

cdef class MyList: 
    cdef public list _base_list 
    cpdef append(self, object item) 
    cpdef pop(self, int index=*)#Note: * is used in place of default values 
    cpdef get_data(self) 

现在我们已经准备好创建我们的mylist.pyx文件,实际上做的工作。为了简单起见,我将使用python列表来实现我们的cython列表(这很不符合性能,但会避免需要钻研数组,这有点麻烦)。代码可能是这样的:

cdef class MyList: 

    def __cinit__(self):#__cinit__ is preferred for cdef class constructors 
     self._base_list = [] 

    cpdef append(self, object item): 
     self._base_list = self._base_list + [item] 

    cpdef pop(self, int index=-1): 
     self._base_list.pop(index) 

    cpdef get_data(self): 
     return self._base_list 

一旦做到这一切编译,你可以在Python中使用这种无聊MyList类。这是在行动MyListmain.py文件:

from mylist import MyList 

a = MyList() 
a.append("apple") 
a.append("banana") 
a.append("tomato") 
a.append("pear") 
a.pop(2)#one of these fruit is not like the others... 
print a.get_data() 

让我知道如果您有编译和运行这个例子中的问题。我在笔记本电脑上使用Python 2.7和最新的Cython主版本(版本0.26b0)对此进行了测试。

+0

谢谢!我看了你的例子,我懂了它的工作原理! :) 还有一个问题。有些人低估了我的帖子,你能告诉我什么是错的/我能做些什么来改进它?再次感谢! –

+0

@Ali Abbas我个人没有倒下,要改进的最重要的事情就是将精确的错误信息添加到您的问题中。否则,我们都只能猜测出了什么问题!另外,考虑到你正在尝试使用cython加速代码,重新实现python的list类将无助于做到这一点。使用'list','object','dict'等输入cdef变量没有多大帮助,因为这些容器可以容纳任何对象,所以不能推断出真实的类型信息。另外,cython的文档很好,可能会清除你对cdef,cpdef和def的疑惑。 – CodeSurgeon

+0

感谢您的反馈 –