Python 缓冲区类型仅允许作为函数局部变量,但';这就是我想要的;我在做什么
Cython不喜欢闭包中的numpy数组Python 缓冲区类型仅允许作为函数局部变量,但';这就是我想要的;我在做什么,python,cython,Python,Cython,Cython不喜欢闭包中的numpy数组 %%cython import numpy as np cimport numpy as np def f(np.ndarray[double, ndim=1] a): def g (double b): return a+b return g(1) 使用稳定版本0.24,我得到: Error compiling Cython file: ---------------------------------------
%%cython
import numpy as np
cimport numpy as np
def f(np.ndarray[double, ndim=1] a):
def g (double b):
return a+b
return g(1)
使用稳定版本0.24,我得到:
Error compiling Cython file:
------------------------------------------------------------
...
import numpy as np
cimport numpy as np
def f(np.ndarray[double, ndim=1] a):
^
------------------------------------------------------------
cython_magic.pyx:4:6: Buffer types only allowed as function local variables
如果我去掉了
g
的定义,它会编译/运行良好。有几个工作循环:
def f(a):
def g (double b):
cdef np.ndarray[double, ndim=1] a_typed = a
return a_typed+b
return g(1)
这与检查每次调用g
时的类型相关,成本很小,其重要性取决于您在g
中做了多少其他工作def f(a):
cdef double[:] memview_of_a = a
def g(double b):
memview_of_a[0] = 0 # example of indexing operation
return a+b
return g(1)
这里需要记住的是,memview\u of_a
和a
查看相同的数据,因此您可以通过两种不同的方式访问它。使用memoryview可以快速建立数组索引。数组上的标量操作实际上不受类型信息的影响,因此没有理由强制它为特定类型总之,这是一个限制,但是有一些工作循环(尽管它们不是很整洁)。如果使用
cython
的目标是生成快速的C代码,为什么要使用奇特的动态Python构造?在灵活性很重要的地方使用Python,在速度很重要的地方使用Cython,不是更好吗?@hpaulj,我正在对一些运行速度太慢的代码进行Cythonization。我有几个变量中的函数,我需要在其中一个变量中快速执行一些操作(比如,数值积分,梯度下降,等等),所以我需要闭包。我想我可以通过一个python调用逃脱你有没有尝试过更新的memoryview语法?我不确定它是否有效,但可能值得一看……这个错误在过去已经被解决了。3所以在谷歌搜索中出现了:,@hpaulj,我在发布我的问题之前阅读了这些内容,但没有发现它们有用。你能更具体地说明他们将如何帮助解决我的问题吗?