Python Cython和阵列
我在试着加快上课的速度。但我仍然希望代码也能在纯Python中运行 如何在类中定义数组(代码已简化) 在.pxd中:Python Cython和阵列,python,arrays,cython,Python,Arrays,Cython,我在试着加快上课的速度。但我仍然希望代码也能在纯Python中运行 如何在类中定义数组(代码已简化) 在.pxd中: import cython cdef class A cdef int[8] S cdef test(self) 但Cython抱怨编译: Cannot convert Python object to 'int [8]' 这是因为语法错误,更像: cdef int S[8] 此外,无需导入cython 这实际上是在一开始就定义的。我终于让它起作
import cython
cdef class A
cdef int[8] S
cdef test(self)
但Cython抱怨编译:
Cannot convert Python object to 'int [8]'
这是因为语法错误,更像:
cdef int S[8]
此外,无需导入cython
这实际上是在一开始就定义的。我终于让它起作用了:
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 test(self)
不。错误消息不会更改。问题似乎是,我必须以某种方式在纯Python中初始化self.S,而不会在编译期间导致类型冲突(或者Cython忽略else情况)。我的代码在没有CPython初始值设定项的情况下工作Cython@RuedigerJungbeck尝试创建一个单独的文件,其中唯一要做的就是创建一个
cdef int S[8]
,看看cython是否能识别,因为我100%确信上述语法是正确的。@RuedigerJungbeck我的建议是将cython与Python完全分开,只需导入所需的函数或类。我这么说是因为cython有很多怪癖,而且大多数怪癖都来自于你太多地将它们结合在一起使用。您还可以尝试使用cpdef
而不是cdef
。这就是我对.pxd文件所做的。我的问题是我有一个用纯Python初始化的语句。当我尝试这样做时(有条件地),Cython拒绝编译。@RuedigerJungbeck,这是意料之中的。很抱歉,你不能得到你想要的。老实说,我也不鼓励用纯cython(我自己的经验)编写应用程序,最好用C/C++编写,然后导入cython(包装它们)。我之所以这么说是因为我担心cython有很多怪癖。只是一个评论,与你的问题没有直接关系,但是如果你想让cython编译的cython部分充分利用cython的加速,您应该始终cdef
您的增量变量:cdefk
…我的目标是加速测试方法。它(在未简化的版本中更复杂)被调用了数百万次,而init只被调用了一次,当然,我知道了。这是一个非常笼统的评论,针对的是其他容易读到这篇文章的人。干杯;)第二个函数应该是test(),而不是next()。
cimport cpython.array
cdef class RC4:
cdef int [:] S
cdef int test(self)