【问题标题】:Compile-time evaluation of if-statements in CythonCython 中 if 语句的编译时评估
【发布时间】:2018-02-22 15:24:02
【问题描述】:

在 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 语句的评估可能会产生可衡量的性能成本。

【问题讨论】:

  • Cython 有 IFDEF 在编译时选择代码(例如 stackoverflow.com/questions/47276648/…),但我认为这不是你所追求的。
  • 这是一种好的 C 编译器可能会自行完成的优化

标签: cython


【解决方案1】:

对于@DavidW 的评论,编译器很有可能会自行识别并优化它。 Godbolt here 上的可比示例 - 在我正在使用的特定 GCC 上,似乎使用 -O3 而不是 -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 不值得这么讨厌,除非性能真的很关键,但它就在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多