我有一个带有结构定义的简单 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 变量位于循环之外,它不会抱怨 A 变量的另一个定义,但我不明白 for 循环有什么特别之处。
Python 和 C 有不同的作用域规则。 Cython 使用与 Python 相同的作用域规则,因此变量在 a 内部“声明”(首先分配)for
/if
/while
或其他块在整个函数的范围内。对于使用声明的变量也是如此cdef
,但正如您所看到的,这些变量必须在函数级别声明,而不是在子块中声明。
我至少可以想到有这个要求的两个充分理由:
- 更清楚的是:具有 C 背景的 Cython 用户在变量没有达到他们预期的范围时不会感到惊讶。
- 这意味着 Cython 生成的 C 代码更紧密地跟踪原始 Cython 代码,我确信这使得 Cython 开发人员更容易调试和实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)