这里不允许使用cdef语句来表示结构

时间:2014-07-31 22:46:45

标签: cython

我有一个带结构定义的简单Astruct.pyx(Astruct.pxd):

cdef struct A:
    int x
    int y
    int z

使用它的Cython函数(struct_test.pyx):

from random import randint
from Astruct cimport A

def do():
    N = 1000000
    M = 65535
    As = []
    total = 0
    for i in xrange(N):
        cdef A a
        a.x = randint(0, M)
        a.y = randint(0, M)
        a.z = randint(0, M)
        As.append(a)
    for i in xrange(N):
        total += As[i].x + As[i].y + As[i].z
    print total

但是,当我尝试构建struct_test.pyx时,我收到此错误:“此处不允许使用cdef语句”,指向“cdef A a”。如果它在循环之外,它不会抱怨A变量的另一个定义,但是我不明白for循环有什么特别之处。

1 个答案:

答案 0 :(得分:13)

Python和C有不同的范围规则。 Cython使用与Python相同的范围规则,因此在for / if / while或其他块内“声明”(首先分配)的变量属于整个函数的范围。对于使用cdef声明的变量也是如此,但正如您所见,这些变量必须在函数级别而不是在子块中声明。

我至少有两个很好的理由可以满足这个要求:

  • 更清楚的是:当他们的变量没有他们可能期望的范围时,以C背景进入Cython的用户不会感到惊讶。
  • 这意味着Cython生成的C代码更密切地跟踪原始的Cython代码,我相信这对Cython开发人员的调试和实现更容易。