Python Cython和阵列

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 这实际上是在一开始就定义的。我终于让它起作

我在试着加快上课的速度。但我仍然希望代码也能在纯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 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)