【发布时间】:2017-07-16 19:16:03
【问题描述】:
我尝试根据我正在处理的项目为 Python 制作一个修改后的列表类,并决定尝试使用 Cython 加速它
在我第一次使用时,该类的大部分功能(特殊功能除外)都不可见且无法访问
我尝试从 cdef、cpdef 和 def 中查找方法和类声明的名称,并尝试使用谷歌搜索查看我是否有正确的语法以及查看其他人是否有类似的问题
这是我的代码:
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
【问题讨论】:
-
看起来您将您的班级声明为
class list_2。您应该将其声明为cdef class list_2,以使其成为 cython 扩展类型。否则,cython 将其视为常规 python 类。文档中的This link 可能有助于了解 cython 类。 -
另外,我不确定尝试重新实现列表类是否一定会给您带来预期的性能优势。如果您的数据都是单一类型,您可能还需要考虑使用 cython 的类型化内存视图或使用 C 数组和指针。了解您为什么对修改列表类感兴趣可能会有所帮助。
-
@CodeSurgeon 好吧,正如我想我提到的,我已经尝试过
cdef、cpdef和def的类声明,它们都给了我相同的结果将这些功能包含在课程中 老实说,我只是想让这个课程在 Cython 和 Python 中进行练习 -
您是否也为您的
.pyx文件编写了.pxd文件(基本上相当于c 头文件)?如果是这样,请将其添加到问题中。编译 cython 代码或运行它时是否出现错误?你能告诉我们这些吗?您为数组类使用了哪些导入? -
对于这类问题,在问题中实际包含错误消息非常有帮助,而不是在 6 cmets 后发布一个模糊的摘要。幸运的是,没有它,你已经得到了一个很好的答案。