代码之家  ›  专栏  ›  技术社区  ›  Paul Terwilliger

为什么“numpy”在左位移位方面比python慢?

  •  2
  • Paul Terwilliger  · 技术社区  · 6 年前

    我在试着做一些改变 numpy 整数(特别是, numpy.uint64 物体)我需要它们快点。在下面的实现中,我将对象放在 numpy.array 因为那是唯一可以接受位左移的对象。如果有任何更快的实施,我会接受它。

    from timeit import timeit
    print(timeit("a << 1", "a = int(2**60)"))
    print(timeit("a << 1", "import numpy as np; a = np.array([2 ** 60], dtype=np.uint64)"))
    print(timeit("np.left_shift(a, 1)", "import numpy as np; a = np.array([2 ** 60], dtype=np.uint64)"))
    

    退货:

    0.056681648000000084
    1.208092987
    1.1685176299999998
    

    为什么python比 努比 为了这次行动?有没有一种方法可以让你的速度和你的相当 努比

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jean-François Fabre    6 年前

    关于性能差异,这似乎是合乎逻辑的:在一个元素上应用向量化的移位。只需到达shift部分并更改numpy结构,就会有很大的开销。本机代码转换得更快。

    >>> a = numpy.uint64(2**60)
    >>> a << 3
    Traceback (most recent call last):
      File "<string>", line 301, in runcode
      File "<interactive input>", line 1, in <module>
    TypeError: ufunc 'left_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
    

    我发现了github的问题: https://github.com/numpy/numpy/issues/2524

    这是因为移位数转换为有符号类型,并且没有大到足以容纳uint64的有符号整数类型。

    现在是一个很好的解决方法(如本文所示) github issue comment )这是:

    a << numpy.uint64(1)