我有一个带结构定义的简单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循环有什么特别之处。
答案 0 :(得分:13)
Python和C有不同的范围规则。 Cython使用与Python相同的范围规则,因此在for
/ if
/ while
或其他块内“声明”(首先分配)的变量属于整个函数的范围。对于使用cdef
声明的变量也是如此,但正如您所见,这些变量必须在函数级别而不是在子块中声明。
我至少有两个很好的理由可以满足这个要求: