本地设置Cython编译器指令会影响一个或所有函数吗?

时间:2016-08-27 12:32:45

标签: python numpy cython

我正在努力使用Cython加速一些Python / Numpy代码,并且对于" local"的效果有点不清楚。设置(在docs中定义为here)编译器指令。在我的情况下,我想使用:

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

我知道我可以在我的setup.py文件中对此进行全局定义,但我正在为非Cython用户开发,并希望从.pyx文件中明确指示。< / p>

如果我正在编写一个.pyx文件,其中定义了多个函数,我只需要设置一次,还是只应用于定义的下一个函数?我问的原因是文档经常说&#34;关闭此功能的boundscheck,&#34;让我想知道它是否只适用于下一个定义的函数。

换句话说,我是否需要这样做:

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

谢谢!

2 个答案:

答案 0 :(得分:5)

documentation表示如果要全局设置编译器指令,则需要在文件顶部添加注释。例如

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

答案 1 :(得分:1)

本手册没有明确说明,但这些指令正在使用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

可能是您正在寻找的,或者它可能是语法错误或无操作。你将不得不尝试看看。