Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缓冲区类型仅允许作为函数局部变量,但';这就是我想要的;我在做什么_Python_Cython - Fatal编程技术网

Python 缓冲区类型仅允许作为函数局部变量,但';这就是我想要的;我在做什么

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不喜欢闭包中的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:
------------------------------------------------------------
...
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
    中做了多少其他工作

  • 混合使用MemoryView和非类型化变量

    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,我在发布我的问题之前阅读了这些内容,但没有发现它们有用。你能更具体地说明他们将如何帮助解决我的问题吗?