Python Cython:内联函数不是纯C
我为Cython提供了以下内联函数Python Cython:内联函数不是纯C,python,optimization,inline,cython,Python,Optimization,Inline,Cython,我为Cython提供了以下内联函数 cpdef inline int c_rate2recs_2(int maxNN,int idx): cdef int out=idx%maxNN return out 然而,这意味着 /* * return out * * cpdef inline int c_rate2recs_2(int maxNN,int idx): # <<<<<<<<<<&l
cpdef inline int c_rate2recs_2(int maxNN,int idx):
cdef int out=idx%maxNN
return out
然而,这意味着
/*
* return out
*
* cpdef inline int c_rate2recs_2(int maxNN,int idx): # <<<<<<<<<<<<<<
* cdef int out=idx%maxNN
* return out
*/
static PyObject *__pyx_pw_6kmc_cy_5c_rate2recs_2(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static CYTHON_INLINE int __pyx_f_6kmc_cy_c_rate2recs_2(int __pyx_v_maxNN, int __pyx_v_idx, CYTHON_UNUSED int __pyx_skip_dispatch) {
int __pyx_v_out;
int __pyx_r;
__Pyx_TraceDeclarations
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("c_rate2recs_2", 0);
__Pyx_TraceCall("c_rate2recs_2", __pyx_f[0], 984);
/*
* return out
*
* cpdef inline int c_rate2recs_2(int maxNN,int idx): # <<<<<<<<<<<<<<
* cdef int out=idx%maxNN
* return out
*/
static PyObject *__pyx_pf_6kmc_cy_4c_rate2recs_2(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_maxNN, int __pyx_v_idx) {
PyObject *__pyx_r = NULL;
__Pyx_TraceDeclarations
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("c_rate2recs_2", 0);
__Pyx_TraceCall("c_rate2recs_2", __pyx_f[0], 984);
__Pyx_XDECREF(__pyx_r);
__pyx_t_1 = PyInt_FromLong(__pyx_f_6kmc_cy_c_rate2recs_2(__pyx_v_maxNN, __pyx_v_idx, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
__Pyx_GOTREF(__pyx_t_1);
__pyx_r = __pyx_t_1;
__pyx_t_1 = 0;
goto __pyx_L0;
__pyx_r = Py_None; __Pyx_INCREF(Py_None);
goto __pyx_L0;
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1);
__Pyx_AddTraceback("kmc_cy.c_rate2recs_2", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
__pyx_L0:;
__Pyx_XGIVEREF(__pyx_r);
__Pyx_TraceReturn(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/*
*返回
*
*cpdef内联int c#U rate2recs#2(int maxNN,int idx):#
由于我是cython行业的新手,我想知道如何摆脱大多数python命令(cython-a将此内联标记为远离纯C)
诀窍在于,如果你能调用你的函数nogil
cpdef inline int c_rate2recs_2(int maxNN,int idx) nogil:
cdef int out=idx%maxNN
return out
那么,不管你看到什么黄色,实际上都不是Python的。例如,它可能是一个错误案例,也可能只是其他类型的轻度检查。在cpdef
的情况下,不仅生成了纯C函数,还生成了用于从Python作用域调用的Python别名。这不会影响速度
在这种情况下,针对手动内联循环的一些计时显示没有减速,删除inline
对时间也没有任何影响。我想一个难以优化的案例可能会表现出不同的特征,但关键是要对其进行分析
最后,可以通过使用来加速和删除一些错误检查。您是否尝试使用cdef
而不是cpdef
?我认为使用cpdef
时,C函数只能使用纯C。谢谢,这解决了我的问题。但是,在这种情况下,性能的提高是可以忽略的。对于这样一个小的函数,最好不要有函数。函数调用增加了开销。实际上,内联函数的调用非常频繁,结果表明,内联版本要快得多。不知道为什么。内联函数更快,因为它实际上是一个函数调用。每次使用时都会复制代码(这就是内联的含义)。唯一的缺点是代码大小。