2012-12-17 15 views
5

मैं Cython: इनलाइन फंक्शन नहीं शुद्ध सी

cpdef inline int c_rate2recs_2(int maxNN,int idx): 
    cdef int out=idx%maxNN 
    return out 

हालांकि इस तब्दील Cython

निम्नलिखित इनलाइन समारोह

/* 
* 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; 
} 

में है के रूप में मैं बहुत cython व्यापार में नया हूँ, मैं चाहते हैं पाइथन कमांड के अधिकांश से छुटकारा पाने के बारे में जानें (cython -a शुद्ध इन से काफी दूर के रूप में इस इनलाइन को ध्वजांकित करता है)।

+2

क्या आपने 'cpdef' के बजाय 'cdef' के साथ प्रयास किया था? मैंने सोचा कि 'cpdef' के साथ यह केवल सी कार्यों के लिए शुद्ध सी होगा। – tiago

+0

धन्यवाद इसने मेरी समस्या हल की। हालांकि, इस मामले में प्रदर्शन में वृद्धि – bios

+0

इतनी छोटी फंक्शन के लिए लापरवाही थी कि यह एक समारोह न हो। फ़ंक्शन कॉल ओवरहेड जोड़ते हैं। – tiago

उत्तर

3

जैसा कि मैंने cython व्यापार में बहुत नया हूँ, मुझे पता है कि अजगर आदेशों की सबसे से छुटकारा पाने के लिए कैसे चाहते हैं

(-एक झंडे इस इनलाइन के रूप में बहुत दूर शुद्ध सी से दूर cython)

चाल यह है कि यदि आप अपना फ़ंक्शन nogil पर कॉल कर सकते हैं;

cpdef inline int c_rate2recs_2(int maxNN,int idx) nogil: 
    cdef int out=idx%maxNN 
    return out 

तब जो भी पीला आप देखते हैं वह वास्तव में पाइथन पर नहीं जाता है। यह एक त्रुटि-मामला हो सकता है, उदाहरण के लिए, या यह अन्य प्रकार की हल्की जांच हो सकती है। cpdef के मामले में, न केवल शुद्ध-सी फ़ंक्शन बनाया गया है, पाइथन उपनाम को पायथन स्कॉप से ​​कॉल करने के लिए बनाया जाता है। यह गति को प्रभावित नहीं करेगा।

इस मामले में मैन्युअल रूप से इनलाइन लूप के खिलाफ कुछ समय कोई मंदी नहीं दिखाता है, और inline को हटाकर उस समय कुछ भी नहीं किया गया था। मुझे कल्पना है कि अनुकूलित करने के लिए कठिन मामला विभिन्न विशेषताओं को दिखा सकता है, लेकिन कुंजी प्रोफाइल है।

अंत में, compiler directives का उपयोग करके त्रुटि-जांच में से कुछ को गति-अप और हटाया जा सकता है।

संबंधित मुद्दे