2010-11-26 3 views
5

그래서 여기에 내 문제가 있습니다 : 파이썬에서 코드를 작성하지만, 너무 느린 코드의 일부분에서 성능을 향상시켜야합니다. 좋은 (그리고 쉬운) 솔루션은 cython을 사용하는 것 같습니다. 나는 그것을 시도하고 좋은 결과를 얻었다. 문제는 내 파이썬 코드에서 assert 문을 사용한다는 것입니다. cython을 사용하기 전에 Python 코드를 -OO 옵션과 함께 컴파일하여 어설 션 테스트를 실행하지 않는 버전을 제공 할 수 있으며 여전히 디버그를위한 어설 션을 가질 수 있습니다. 그러나 cython으로 컴파일 된 파일은 항상 어설 션을 실행하는 것처럼 보입니다. 어썰 토션을 제거 (또는 제거하지 않음)하기 위해 cython 컴파일로 전달할 수있는 옵션이 있습니까?cython에서 컴파일 할 때 python 어설 션을 제거하는 방법은 무엇입니까?

+0

dont 'know ...하지만 사용하려는 파일에서 파이썬 어썰트를 모두 주석 처리하는 간단한 프로그램을 작성하는 것은 어떻습니까? – Ant

+0

+1 : 직접이 문제를 발견했습니다. 코드를 빠르게 만들 수 있도록 설계된 것이 가장 단순한 최적화를 수행하지 않는다는 것이 이상합니다. –

답변

7

C 전처리 매크로 PYREX_WITHOUT_ASSERTIONS을 정의하면 Cython이 어설 션을 건너 뜁니다. 따라서 생성 된 C 파일을 컴파일 할 때 -DPYREX_WITHOUT_ASSERTIONS을 C 컴파일러로 전달하십시오. 이를 수행하는 방법은 빌드 프로세스에 따라 다릅니다.

+0

이 빠른 답변에 감사드립니다. Distutils 메서드를 사용하고 있으므로 매크로를 컴파일러에 전달하는 방법을 확인해야합니다. – user521353

+1

CYTHON_WITHOUT_ASSERTIONS도 마찬가지로 작동하지만 이전 버전과의 호환성을 위해 PYREX_WITHOUT_ASSERTIONS를 지원합니다. – robertwb

0

또한 PYPI (Python Package Index)에 발견하고 주사위를 사용하여 인출 할 수 있습니다 사용 pypreprocessor

.

from pypreprocessor import pypreprocessor 

pypreprocessor.parse() 

#define debug 

#ifdef debug 
...place assert to be removed here... 
#endif 

이것은 기본적으로 조건부 컴파일이하는 표준 C 프리 프로세서와 동일하게 작동 :

여기에 구현입니다.

SideNote :이 모듈은 python2x 및 python3k와 호환됩니다.

면책 조항 : 저는 pypreprocessor의 저자입니다.

이렇게하면 사전 처리기가 추가되어 초기로드 시간이 길어 지지만 출력되는 바이트 코드 (.pyc)가 최적화됩니다.

관련 문제