如何在Cython编译时去除Python断言?

6 投票
2 回答
2854 浏览
提问于 2025-04-16 07:38

我遇到了一个问题: 我用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编译器。具体怎么做取决于你的构建过程。

撰写回答