2010-11-26 43 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)将进行优化。