在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语句的评估否则会产生可测量的性能成本。
答案 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不值得肮脏,除非真正的性能至关重要,但它就在那里。