在检查奇数时是否比%快?

2024-10-01 02:17:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

>>> isodd(10)
False
>>> isodd(9)
True

Tags: orandfalsetruereturndef整数num
3条回答

老实说,我认为这无关紧要。

第一个问题是可读性。什么对其他开发人员更有意义?一、 就个人而言,在检查一个数字的均匀性/奇异性时,会期望有一个模。我希望其他大多数开发人员也会有同样的期望。通过引入一种不同的、意外的方法,您可能会使代码读取(因此维护)变得更加困难。

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

是的。标准库中的timeit模块就是如何检查这些东西的。E、 克:

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

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

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

让程序员相信微观优化本质上是无关紧要的,这已经证明是一项不可能完成的任务——尽管已经过去了35年(在这35年中,计算机的速度提高了几个数量级!)自从Knuthwrote

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.

正如他所解释的,这是引用了霍尔的一个更古老的声明。我想每个人都完全相信他们的案子只剩下3%!

因此,我们(特别是蒂姆·彼得斯,在这里应该得到荣誉)没有无休止地重复“没关系”,而是放进了标准的Python库模块timeit,这使得测量这样的微基准变得非常容易,因此至少让一些程序员说服自己,嗯,这个病例确实属于97%的人群!-)

最好的优化方法是将测试放入函数中number % 2和“number&;1”是检查奇数/均匀性的非常常见的方法,经验丰富的程序员会立即识别出该模式,并且您总是可以输入诸如“如果number是奇数,则可以输入blah blah”之类的注释,如果您真的需要将其显示出来。

# state whether number is odd or even
if number & 1:
    print "Your number is odd"
else:
    print "Your number is even"

相关问题 更多 >