在检查奇数时是否&%比%快?
要检查奇数和偶数整数,最低位检查比使用模数检查更有效吗?
>>> def isodd(num):
return num & 1 and True or False
>>> isodd(10)
False
>>> isodd(9)
True
-
是的
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
如您所见,在我的(第一天==旧==慢;-) Macbook Air上,该
&
解决方案的重复速度比该%
解决方案快7到18纳秒。timeit
不仅告诉您更快的方法,而且告诉您执行速度快了多少(只需运行几次测试),这通常表明它极其重要(调用函数的开销大约为400时,您 真的
关心10纳秒的差异)吗??!-)…自Knuth撰写以来已经有35年的时间了(使计算机更快地获得数量级的增长!),已经说服了程序员说微优化本质上是不相关的,这已被证明是不可能完成的任务。
我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。
正如他所解释的那样,这是引用自Hoare的一份更早的声明。我猜每个人都完全相信,他们的案件占剩下的3%!
因此,我们不停地重复“无关紧要”,我们(特别是蒂姆·彼得斯(Tim
Peters)应得的荣誉)放入标准的Python库模块中timeit
,这使得测量此类微基准变得轻而易举,从而至少让 一些
程序员说服自己,嗯,这种情况确实属于97%的人群!-)