【问题标题】:Do locally set Cython compiler directives affect one or all functions?本地设置的 Cython 编译器指令会影响一个或所有函数吗?
【发布时间】:2016-08-27 12:32:44
【问题描述】:

我正在努力使用 Cython 加速一些 Python/Numpy 代码,但对“本地”设置(如文档中定义的 here)编译器指令的影响有点不清楚。就我而言,我想使用:

@cython.wraparound (False) #turn off negative indexing
@cython.boundscheck(False) #turn off bounds-checking

我知道我可以在我的 setup.py 文件中全局定义它,但我正在为非 Cython 用户开发,并且希望这些指令在 .pyx 文件中是显而易见的。

如果我正在编写一个.pyx 文件,其中定义了多个函数,我只需要设置一次,还是只适用于定义的下一个函数?我问的原因是文档经常说“关闭此函数的boundscheck”之类的内容,这让我想知道它是否仅适用于定义的下一个函数。

也就是说,我需要这样做吗:

import numpy as np
cimport numpy as np
cimport cython

ctypedef np.float64_t DTYPE_FLOAT_t

@cython.wraparound (False) #turn off negative indexing
@cython.boundscheck(False) # turn off bounds-checking
def myfunc1(np.ndarray[DTYPE_FLOAT_t] a):
    do things here

def myfunc2(np.ndarray[DTYPE_FLOAT_t] b):
    do things here

或者我需要这样做:

import numpy as np
cimport numpy as np
cimport cython

ctypedef np.float64_t DTYPE_FLOAT_t

@cython.wraparound (False) #turn off negative indexing
@cython.boundscheck(False) # turn off bounds-checking
def myfunc1(np.ndarray[DTYPE_FLOAT_t] a):
    do things here

@cython.wraparound (False) #turn off negative indexing
@cython.boundscheck(False) # turn off bounds-checking
def myfunc2(np.ndarray[DTYPE_FLOAT_t] b):
    do things here

谢谢!

【问题讨论】:

    标签: python numpy cython


    【解决方案1】:

    documentation 声明如果您想全局设置编译器指令,您需要在文件顶部添加注释。例如。

    #!python
    #cython: language_level=3, boundscheck=False
    

    【讨论】:

    • ...或setup.py
    【解决方案2】:

    手册并没有明确说明,但这些指令使用的是decorator notation。在纯 Python 中,

    @decorator2
    @decorator1
    def fn(args):
        body
    

    是语法糖

    def fn(args):
        body
    fn = decorator2(decorator1(fn))
    

    所以我的期望是指令会这样工作,这意味着它们只适用于下一个函数。

    Cython 手册还说编译器指令可以在with 语句中使用。不幸的是,它没有说的是这些是否可以出现在顶层:

    with cython.wraparound(False), cython.boundscheck(False):
    
        def myfunc1(np.ndarray[DTYPE_FLOAT_t] a):
            do things here
    
        def myfunc2(np.ndarray[DTYPE_FLOAT_t] b):
            do things here
    

    可能是您要查找的内容,也可能是语法错误或无操作。你将不得不尝试看看。

    【讨论】:

    • 在测试代码示例后,似乎在顶层使用with 语句不会将指令应用于函数,并且您是正确的,需要在 每个函数。当我在每个函数之前使用装饰器时,大约 10% 的加速证实了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多