2011-01-17 7 views
7

일부 루프 집약적 인 계산을 수행하고 코드를 Cython으로 변환했습니다. 내가 생각Cython float division 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;} 
     } 

: 나는이 다소 노란 선이고는 다음과 같은 무언가를, 사이 썬의 -a 옵션을 사용하여 프로파일 링 및 .html 파일을 검사하고, 내가 플로트 부문을 할 때마다 것 같다 않았다 저는 분수가 0 인 경우입니다. 저는 상수를 사용하고 있으며 분수가 0이 될 확률은 없으며 더 빠르게 할 수있는 방법이 있는지 궁금합니다. 제수가 일정하면

+0

이미 'cdef float yourconstant'를 사용하고 있습니까 (다른 부분에도 해당)? 일부 코드를 보여줄 수 있습니까? – TryPyPy

+0

흠,'cdef double'이 더 좋아 보인다. – TryPyPy

답변

13

.

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 곱 수 있습니다 대신

당신은 예외 검사를 피하기 위해 @cython.cdivision(True)를 추가 할 필요가