gpt4 book ai didi

cython - 此处不允许使用cdef语句进行结构

转载 作者:行者123 更新时间:2023-12-04 13:27:05 26 4
gpt4 key购买 nike

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

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循环有什么特别之处。

最佳答案

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

我可以想到至少有两个充分的理由有此要求:

  • 更清楚的是:当C语言背景为Cython的用户的变量没有预期的范围时,他们不会感到惊讶。
  • 这意味着Cython生成的C代码会更紧密地跟踪原始的Cython代码,我敢肯定,这可以使Cython开发人员更轻松地进行调试和实现。
  • 关于cython - 此处不允许使用cdef语句进行结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070165/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com