2014-01-25 6 views
2

Cython 헤더 지시문을 활용하고 향후 가져 오기를 활용하는 올바른 방법은 무엇입니까? 파이썬 2.7.xCython 헤더 지시문 및 __future__

예 :

1: from __future__ import division 
2: #cython: boundscheck=False 
3: #cython: wraparound=False 
<strike>4: #cython: cdivision=True</strike> 
4: #cython: cdivision=False 

이 (미래 버전을 사용) 예상대로 부문 작동을 보장하지만이 지침이 준수되고 있는지 확신입니다. 라인 1을 라인 4와 바꾸면 division이 표준 Python 2.x 메소드로 되돌아갑니다.

+3

'cdivision'과 true-division 모순이 아닙니까? C int와 같이 int를 나눈다고합니다. 다른 하나는 파이썬이 떠 다니는 것처럼 int를 나눕니다. – user2357112

+0

나는 cython 지시어 이후에 미래의 import를 넣을 것이다. 향후 가져 오기는 주석 뒤에 나타날 수 있지만 컴파일러 지시문은 코드 뒤에 나타날 수 없습니다. – user2357112

+0

@ user2357112 감사합니다. 나는 또한 당신이 당신의 첫번째 코멘트에서 의미하는 것을 본다. cdivision = False (기본값)입니다. – Jzl5325

답변

3

@ user2357112에 의해 설명되었습니다. #cython: cdivision=True은 (는) from __future__ import division과 모순됩니다. 이 코드는 예시 :

#cython: wraparound=False 
#cython: boundscheck=False 
#cython: nonecheck=False 
#cython: profile=False 
from __future__ import division 

def main(): 
    cdef double i, j 
    i = 0 
    j = 2 
    print 1/j 
    print 1/i 
    print 1/2 

모금 :

print 1/i 
ZeroDivisionError: float division 

#cython: cdivision=True 추가가 줄 것이다 : 당신이 1/2을 볼 수 있습니다

0.5 
inf 
0 

가 바닥 부문으로 처리된다. 당신이 언급 한 바와 같이이 경우

내가 파이썬 2.X를 사용할 때 부동 소수점 부문을 원하는 목적지 플로트 포인트 1/2.을 적용하는 것이 좋습니다

...

하면 라인을 스와핑 :

from __future__ import division 
#cython: wraparound=False 
#cython: boundscheck=False 
#cython: nonecheck=False 
#cython: profile=False 
#cython: cdivision=True 

합니다 모두 "the Cython global directives"을 취소하십시오. 왜냐하면 "코드 앞에 나타나야합니다 (그러나 다른 주석이나 공백 뒤에 나타날 수 있기 때문입니다").