如何在Cython编译时去除Python断言?
我遇到了一个问题: 我用Python编程,但有些代码运行得太慢,我需要提高性能。一个看起来不错(而且简单)的解决办法是使用Cython;我试过,效果很好。 问题是我在Python代码中使用了assert语句。在使用Cython之前,我可以用 -OO 选项编译我的Python代码,这样就能生成一个不执行任何断言测试的版本,同时在调试时还能保留assert语句。但是,用Cython编译的文件似乎总是会执行这些assert语句。有没有什么选项可以在Cython编译时去掉(或者保留)这些断言呢?
2 个回答
-1
可以使用 pypreprocessor。
这个工具也可以在 PYPI(Python包索引) 找到,并且可以通过pip来下载。
下面是它的实现:
from pypreprocessor import pypreprocessor
pypreprocessor.parse()
#define debug
#ifdef debug
...place assert to be removed here...
#endif
这个工具的工作原理和标准C语言中的预处理器条件编译是一样的。
附注:这个模块兼容python2x和python3k。
免责声明:我是pypreprocessor的作者。
使用这个工具会让初次加载的时间变长,因为增加了预处理的步骤,但输出的字节码(.pyc文件)会得到优化。
10
Cython会跳过一些检查,如果你定义了一个叫做 PYREX_WITHOUT_ASSERTIONS
的C预处理器宏。所以在编译生成的C文件时,需要把 -DPYREX_WITHOUT_ASSERTIONS
这个选项传给C编译器。具体怎么做取决于你的构建过程。