如何在 Cython 中使用 `restrict` 关键字?
How to use the `restrict` keyword in Cython?
我在 CPython 3.6 中使用 Cython,我想将一些指针标记为“未别名”,以提高性能并在语义上明确。
在 C 中,这是通过 restrict
(__restrict
、__restrict__
)关键字完成的。但是如何在 Cython .pyx
代码的 cdef
变量上使用 restrict
?
谢谢!
Cython 没有 syntax/support 作为 restrict
关键字(还没有?)。你最好的选择是用 C 编写这个函数,最方便的可能是使用 verbatim-C 代码,例如这里有一个虚拟的例子:
%%cython
cdef extern from *:
"""
void c_fun(int * CYTHON_RESTRICT a, int * CYTHON_RESTRICT b){
a[0] = b[0];
}
"""
void c_fun(int *a, int *b)
# example usage
def doit(k):
cdef int i=k;
cdef int j=k+1;
c_fun(&i,&j)
print(i)
这里我使用 Cython 的(未记录的)定义 CYTHON_RESTRICT
,其中 is defined 为
// restrict
#ifndef CYTHON_RESTRICT
#if defined(__GNUC__)
#define CYTHON_RESTRICT __restrict__
#elif defined(_MSC_VER) && _MSC_VER >= 1400
#define CYTHON_RESTRICT __restrict
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define CYTHON_RESTRICT restrict
#else
#define CYTHON_RESTRICT
#endif
#endif
所以它不仅适用于 C99 兼容的 c 编译器。然而,在长 运行 中,最好定义类似的东西而不依赖于未记录的功能。
我在 CPython 3.6 中使用 Cython,我想将一些指针标记为“未别名”,以提高性能并在语义上明确。
在 C 中,这是通过 restrict
(__restrict
、__restrict__
)关键字完成的。但是如何在 Cython .pyx
代码的 cdef
变量上使用 restrict
?
谢谢!
Cython 没有 syntax/support 作为 restrict
关键字(还没有?)。你最好的选择是用 C 编写这个函数,最方便的可能是使用 verbatim-C 代码,例如这里有一个虚拟的例子:
%%cython
cdef extern from *:
"""
void c_fun(int * CYTHON_RESTRICT a, int * CYTHON_RESTRICT b){
a[0] = b[0];
}
"""
void c_fun(int *a, int *b)
# example usage
def doit(k):
cdef int i=k;
cdef int j=k+1;
c_fun(&i,&j)
print(i)
这里我使用 Cython 的(未记录的)定义 CYTHON_RESTRICT
,其中 is defined 为
// restrict
#ifndef CYTHON_RESTRICT
#if defined(__GNUC__)
#define CYTHON_RESTRICT __restrict__
#elif defined(_MSC_VER) && _MSC_VER >= 1400
#define CYTHON_RESTRICT __restrict
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define CYTHON_RESTRICT restrict
#else
#define CYTHON_RESTRICT
#endif
#endif
所以它不仅适用于 C99 兼容的 c 编译器。然而,在长 运行 中,最好定义类似的东西而不依赖于未记录的功能。