【问题标题】:>> and / in python language>> 和 / 在 python 语言中
【发布时间】:2012-03-25 16:48:04
【问题描述】:

在python语言中,'>>'运算符和'/'运算符在执行时间方面有什么区别,当我们将任何整数除以'2'的倍数时,为什么?

【问题讨论】:

  • 如果它很重要(提示:它不重要),你最好写 C。
  • 如果您关心差异,请不要使用 Python。此外,这可能是特定于 CPU 的。
  • 实际上我刚刚解决了一个 spoj 问题,其中执行时间存在差异,所以我很想知道它具有与 C 中相同的功能

标签: python operator-keyword


【解决方案1】:

是的,有:

>>> timeit.timeit('a = 32; a / 2')
0.32588499376317426
>>> timeit.timeit('a = 32; a >> 1')
0.27532270162828

原因似乎很明显 - 位操作更快。

无论如何,这种差异不是使用>>而不是/进行除法的理由。

【讨论】:

  • 我不认为“对字节的操作更快”解释了这一切。尝试比较a=32; a*2a=32; a << 1:至少对我而言,乘法比位移
  • @DSM 我无法重现您的结果 - 左移比乘法更快
  • 对我来说,我得到 ~0.081 vs ~0.096 (2.7.2)。很明显,操作执行时间本身会受到足够多的噪音(编译器选项?月相?),笼统的陈述会很困难。
【解决方案2】:

>> 仅适用于整数。 / 的行为取决于您使用的是 2.x 还是 3.x(或者从 __future__ 导入了 division)。因此,重要的区别速度无关。

【讨论】:

    【解决方案3】:

    默认 Python 实现的开销非常大,如果你关心这样的事情,它就是错误的语言。 These slides from Unladen Swallow presentation 很有启发性...

    事实上,>> 会比/ 快。但这不是来自进行除法的成本,而是来自确定您是要对浮点数还是整数进行除法的开销!如果您改为除以 //(假定为 int),那将与 >> 一样快...

    【讨论】:

    • 但是根据下面的分析,'//'在python 2.7中比'>>'慢。>>> timeit.timeit('a = 1000000000000000; a//2') 0.3532679080963135 >>> timeit.timeit('a = 1000000000000000; a>>1') 0.2281970977783203
    【解决方案4】:

    嗯,几乎可以肯定的是,当事先不知道类型时,位移会更快。但我们也许可以聪明一点。让我们检查一下:

    In [11]: 2**20-37
    Out[11]: 1048539
    
    In [12]: timeit 1048539 >> 14
    10000000 loops, best of 3: 29 ns per loop
    
    In [13]: 2**14
    Out[13]: 16384
    
    In [14]: timeit 1048539 /16384
    10000000 loops, best of 3: 72.2 ns per loop
    
    In [15]: timeit 1048539 //16384
    10000000 loops, best of 3: 29.1 ns per loop
    

    注意最后一种情况:如果我们用// 专门处理整数,它几乎完全一样!

    尤其是在 Python 中,事先不知道类型,否则很难优化这类事情。另一方面,这意味着 / 也可以与非整数一起使用——这可能是一个错误或一个特性,这取决于你实际在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2013-11-16
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多