2010-11-26 27 views
5

所以,這裏是我的問題: 我在python中的代碼,但我需要改善我的代碼的一部分太慢的性能。一個好的(簡單的)解決方案似乎是使用cython;我試過了,取得了很好的效果。 問題是我在我的Python代碼中使用assert語句。在使用cython之前,我可以用-OO選項編譯我的python代碼,這樣我就可以提供一個不執行任何斷言測試的版本,並且仍然具有用於調試的斷言。但是用cython編譯的文件似乎總是執行斷言。是否有一些選項可以傳遞給cython編譯來刪除(或不刪除)斷言?在cython中編譯時如何去除python聲明?

+0

不知道......但怎麼樣讓一個簡單的程序來註釋掉你想使用的文件中的所有python斷言? – Ant 2010-11-26 12:46:04

+0

+1:我自己發現了這個問題。奇怪的是,設計使代碼更快的東西並不是對所有代碼進行最簡單的優化。 – 2010-11-26 13:01:29

回答

7

如果您定義C預處理器宏PYREX_WITHOUT_ASSERTIONS,Cython將跳過斷言。因此,在編譯生成的C文件時,將-DPYREX_WITHOUT_ASSERTIONS傳遞給C編譯器。如何取決於你的構建過程。

0

使用pypreprocessor

這也可以在PYPI (Python Package Index)發現和使用PIP是牽強。

這裏的實現:

from pypreprocessor import pypreprocessor 

pypreprocessor.parse() 

#define debug 

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

這本質上的工作方式相同標準C預處理條件編譯呢。

SideNote:這個模塊兼容python2x和python3k。

聲明:我是pypreprocessor的作者。

由於添加了預處理器階段,這會使初始加載花費更長的時間,但輸出的字節碼(.pyc)將進行優化。