以更快的速度找到偶数if(n%2 == 0)或if(n&1 == 0)吗?
def isEven(n):
if n%2 == 0:
return True
return False
OR
def isEven(n):
if n&1 == 1:
return False
return True
答案 0 :(得分:2)
我希望对那些表达式等效的语言进行合理的优化编译器,以等效地实现这两个选项。
事实上,我尝试了four different C++ compilers:gcc,clang,MSVC和icc,而每个编译器实现的习语都不同于其他编译器 1 ,三个四个编译器中有两个以相同的方式实现。
只有icc生成了不同的代码,在这种情况下(n & 1) == 0
生成的代码要比n % 2 == 0
好得多-但是您应该考虑icc的错误。
但是,并非所有语言都实现优化的编译器(提前或JIT),尤其是解释器可能会或可能不会进行类似的优化。如果您对特定的语言或平台感兴趣,可以考虑标记您的问题以体现这一点。
1 对于这样简单的代码,这实际上是令人惊讶且不寻常的。总体而言,clang生成了最佳代码,其次是MSVC,然后是gcc。 icc为n % 2
选项生成了非常糟糕的代码。奇怪的是,与-O1
相比,gcc在-O2
上生成的代码严格更好。
答案 1 :(得分:1)
这看起来像Python,所以我在Python(3.6)中尝试过:
from timeit import timeit
a = timeit(stmt='for i in range(100): i%2')
b = timeit(stmt='for i in range(100): i&1')
print(a, b)
时间变化很大(谢谢,垃圾收集器!),但是总的来说,i%2
使我花了4.7秒,i&1
使我花了6.3秒,我想这可能不是您的答案期待。
我使用dis检查了字节码,唯一的区别是运行BINARY_MODULO与BINARY_AND的一行,所以我不确定为什么会有如此大的时间差异。