我是新来的Cython和尝试加速我的kivy移动游戏使用Cython代码在关键的人工智能模块。我的代码如下:
import numpy as np
cimport numpy as np
#not relevant parts
cdef np.ndarray posarr
cdef np.int poslast = 0
cdef np.int posidx = 0
def posarr_init(np.ndarray pawnpos, np.int act):
poslast = 0
# not relevant, but referencing poslast
#not relevant, but including function where poslast is referenced (not assigned)
def consider_pawn(np.int x, np.int y):
cdef np.int pact, posx, posy, resx, resy
cdef np.int p
cdef np.int found = 0
#not relevant
#in the code there is this line, posx and posy are local variables
posarr[poslast, posx, posy] = posarr[posidx, posx, posy]
在这里,Cython给出了编译过程中的错误:
^{pr2}$我可以看到Cython编译错误的报告顺序与它们在代码中出现的顺序相同。我的问题是:
为什么Cython认为poslast是局部变量?在
为什么在以前的函数中它不把它当作局部变量呢?在
生成的C文件是空的,它只有一条不应该在内部使用的消息。有没有一种方法可以强迫Cython在文件中保留C代码,即使有编译错误?也许查看这个文件可以帮助我理解错误信息(例如,为什么这个变量被认为是本地的)。。。在
简短回答
使用}为全局。在
global
语句在每个写入poslast
的函数中显式地声明{长答案
Cython遵循Python绑定规则:如果在函数中的任何地方分配了一个名称,则假定它是一个局部变量,除非您显式地将其声明为全局变量。在
我想您应该在示例循环之后执行并赋值给
poslast
,这使得它成为隐式声明的局部变量(类型为object
)。然后循环似乎使用了这个尚未初始化的本地。在您的
posarr_init
函数也同样不正确。它将隐式声明的localposlast
赋值,而不接触全局。在相关问题 更多 >
编程相关推荐