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

发布于 2021-01-29 19:02:29

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

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

>>> isodd(10)
False
>>> isodd(9)
True
关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    是的 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%的人群!-)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看