2011-01-17 17 views
7

जाँच मैं कुछ पाश गहन गणना कर रहा हूँ और Cython में कोड बदल दिया। मैं cython -एक विकल्प के साथ की रूपरेखा था, और .html फ़ाइल का निरीक्षण किया, और ऐसा लगता है जब भी मैं नाव विभाजन करते हैं, वहाँ कुछ हद तक पीली लाइन है और यह निम्नलिखित की तरह कुछ करता है:Cython नाव विभाजन PyExc_ZeroDivisionError

if (unlikely(__pyx_t_37 == 0)) { 
     PyErr_Format(PyExc_ZeroDivisionError, "float division"); 
     {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
     } 

मैं इसे लगता है ऐसे मामलों में जहां विभक्त 0. है मुझे लगता है कि के लिए एक निरंतर उपयोग कर रहा हूँ और वहाँ कोई संभावना है कि विभक्त 0 है, और अगर वहाँ कुछ भी मैं कर सकता है यह तेजी से बनाने के लिए है मैं सोच रहा था के लिए है।

+0

क्या आप पहले से ही 'cdef float yourconstant' (और विभाजन के दूसरे भाग के लिए भी) का उपयोग कर रहे हैं? आप कोड के कुछ दिखा सकते हैं? – TryPyPy

+0

हम्म, यह यह पसंद 'बेहतर double' cdef लग रहा है। – TryPyPy

उत्तर

13

आप @cython.cdivision(True) जोड़ने के लिए अपवाद चेकिंग से बचने के लिए की जरूरत है।

import cython 

cdef double pydivision(): 
    cdef int i 
    cdef double k, j 
    k = 2.0 
    j = 0.0 
    for i in range(10): 
    j += i/k 
    # Generated code: Python exception checking 
    # /* "checksum.pyx":9 
    # * j = 0.0 
    # * for i in range(10): 
    # *  j += i/k    # <<<<<<<<<<<<<< 
    # * return j 
    # * 
    # */ 
    # if (unlikely(__pyx_v_k == 0)) { 
    #  PyErr_Format(PyExc_ZeroDivisionError, "float division"); 
    #  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
    # } 
    # __pyx_v_j = (__pyx_v_j + (__pyx_v_i/__pyx_v_k)); 
    # } 
    return j 

#This decorator works wonders 
@cython.cdivision(True) 
cdef double cdivision(): 
    cdef int i 
    cdef double k, j 
    k = 2.0 
    j = 0.0 
    for i in range(10): 
    j += i/k 
    # Generated code: no exception checking 
    # /* "checksum.pyx":20 
    # * j = 0.0 
    # * for i in range(10): 
    # *  j += i/k    # <<<<<<<<<<<<<< 
    # * return j 
    # * 
    # */ 
    # __pyx_v_j = (__pyx_v_j + (__pyx_v_i/__pyx_v_k)); 
    # } 
    return j 
+1

या आप एक वैश्विक निर्देश उपयोग कर सकते हैं। http://wiki.cython.org/enhancements/compilerdirectives देखें –

+0

इस के लिए धन्यवाद एक बहुत! – joon

0

तो भाजक स्थिर है, तो आप 1/divisor से गुणा कर सकते हैं बजाय

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