检查奇数时是否快于%?

riz*_*iza 28 python performance bit-manipulation modulo

要检查奇数和偶数整数,最低位检查是否比使用模数更有效?

>>> def isodd(num):
        return num & 1 and True or False

>>> isodd(10)
False
>>> isodd(9)
True
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 59

是的.timeit标准库中的模块是您检查这些内容的方式.例如:

AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(9)'
1000000 loops, best of 3: 0.446 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(10)'
1000000 loops, best of 3: 0.443 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(10)'
1000000 loops, best of 3: 0.453 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(9)'
1000000 loops, best of 3: 0.461 usec per loop
Run Code Online (Sandbox Code Playgroud)

如您所见,在我的(第一天== old == slow ;-) Macbook Air上,该&解决方案的重复速度比%解决方案快7到18纳秒.

timeit不仅告诉你什么更快,而且告诉你多少(只需运行几次),这通常表明它是多么重要(当你调用函数的开销大约为400时,你真的关心10纳秒的差异吗?)?! - )...

令人信服的程序员认为微观优化本质上是不相关的已被证明是一项不可能完成的任务 - 尽管已经过了35年(计算机已经快了几个数量级!)因为Knuth 写道

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源.

正如他所解释的那样是来自霍尔的一个更古老的陈述的引用.我想每个人都完全相信他们的案子会落在剩余的3%!

因此,我们(Tim Peters特别值得获得荣誉)不是无休止地重复"无关紧要",而是放入标准的Python库模块timeit,这使得测量这样的微基准变得非常容易,从而至少让一些程序员说服自己,嗯,这个案子属于97%组! - )

  • 不,Python编译器本身经过优化,最大限度地简化,可靠和快速 - 它不会进行优化,例如更改正在使用的操作(例如,它必须推断`x`总是整数,例如).如果您需要这种低级优化(即每个纳秒都很重要),请尝试psyco. (2认同)

Tho*_*ens 23

说实话,我认为不重要.

第一个问题是可读性.对其他开发者更有意义的是什么?我个人会在检查数字的均匀度/奇数时期望模数.我希望大多数其他开发人员都期望同样的事情.通过引入一种不同的,意外的方法,您可能会使代码读取更难以进行维护.

第二个事实是,在进行任何操作时,您可能不会遇到瓶颈.我是为了优化,但早期优化是你可以在任何语言或环境中做的最糟糕的事情.如果由于某种原因,确定一个数字是偶数还是奇数是一个瓶颈,那么找到解决问题的最快方法.然而,这让我回到了我的第一点 - 第一次编写例程时,它应该以尽可能最可读的方式编写.

  • semiuseless:我还在学习Python,但我个人认为模运算符更像是Pythonic,因为你正在做的是预期的.至少对我而言,更为明显和清晰. (2认同)

too*_*php 10

您可以获得的最佳优化是将测试放入函数中.' number % 2'和'数字&1'是检查奇/偶的常用方法,有经验的程序员会立即识别模式,你可以随时抛出一个评论,如'#如果数字是奇数,那么等等等等等等等你真的需要它显而易见.

# state whether number is odd or even
if number & 1:
    print "Your number is odd"
else:
    print "Your number is even"
Run Code Online (Sandbox Code Playgroud)