Cython中if语句的编译时评估

时间:2018-02-22 15:24:02

标签: cython

在Cython中,有没有办法实现条件的编译时评估?例如

之类的东西
def func(bint value):
    cdef int i
    for i in range(1000000):
        # Some stuff is calculated
        if value:
            # Do something...
        else:
            # Do something else...

有没有办法让Cython创建两个版本的函数,一个用于value==True,另一个用于value==False?在每次循环迭代中对if语句的评估否则会产生可测量的性能成本。

1 个答案:

答案 0 :(得分:1)

对于@ DavidW的评论,编译器有可能通过它自己识别和优化它。关于godbolt here的可比较示例 - 似乎检查是使用-O3取消的,而不是{I}我使用的特定GCC上的-O2

double func(bool value) {
    double accum = 0.0;
    for (int i = 0; i < 100000; ++i) {
        if (value) {
            accum += 0.05;
        } else {
            accum += 0.10;
        }
    }
    return accum;
}

如果你想保证支票被取消,你显然可以手动解除,但这可能会导致代码重复。

如果在编译时真正知道value,使用c++可以使用模板或if constexpr(c ++ 17)来生成编译时特化。

您还可以选择使用C宏来帮助管理复制。 IMO不值得肮脏,除非真正的性能至关重要,但它就在那里。