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
老实说,我认为这无关紧要。
第一个问题是可读性。什么对其他开发人员更有意义?一、 就个人而言,在检查一个数字的均匀性/奇异性时,会期望有一个模。我希望其他大多数开发人员也会有同样的期望。通过引入一种不同的、意外的方法,您可能会使代码读取(因此维护)变得更加困难。
第二个事实是,在执行任何一个操作时,您可能都不会遇到瓶颈。我支持优化,但在任何语言或环境中,早期优化都是最糟糕的。如果出于某种原因,确定一个数字是偶数还是奇数是一个瓶颈,那么就找到解决问题的最快方法。然而,这让我回到了我的第一点——第一次编写例程时,它应该以最可读的方式编写。
是的。标准库中的
timeit
模块就是如何检查这些东西的。E、 克:如您所见,在我的(第一天==old==slow;-)MacBookAir上,
&
解决方案的重复速度比%
解决方案快7到18纳秒。timeit
不仅告诉你什么是更快的,还告诉你多少(只运行几次测试),这通常表明它是多么的不重要(当调用函数的开销在400左右时,你真的关心10纳秒的差异吗?!-)...让程序员相信微观优化本质上是无关紧要的,这已经证明是一项不可能完成的任务——尽管已经过去了35年(在这35年中,计算机的速度提高了几个数量级!)自从Knuthwrote
正如他所解释的,这是引用了霍尔的一个更古老的声明。我想每个人都完全相信他们的案子只剩下3%!
因此,我们(特别是蒂姆·彼得斯,在这里应该得到荣誉)没有无休止地重复“没关系”,而是放进了标准的Python库模块
timeit
,这使得测量这样的微基准变得非常容易,因此至少让一些程序员说服自己,嗯,这个病例确实属于97%的人群!-)最好的优化方法是将测试放入函数中
number % 2
和“number&;1”是检查奇数/均匀性的非常常见的方法,经验丰富的程序员会立即识别出该模式,并且您总是可以输入诸如“如果number是奇数,则可以输入blah blah”之类的注释,如果您真的需要将其显示出来。相关问题 更多 >
编程相关推荐