代码之家  ›  专栏  ›  技术社区  ›  Padix Key

Cython中if语句的编译时计算

  •  2
  • Padix Key  · 技术社区  · 6 年前

    在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 回复  |  直到 6 年前
        1
  •  1
  •   chrisb    6 年前

    根据@DavidW的评论,编译器很有可能自己识别并优化它。螺栓上的可比示例 here -看来这张支票被取消了 -O3 ,不带 -O2 在我使用的特定GCC上。

    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不值得这么做,但它确实存在。