gpt4 book ai didi

python - 为什么 `numpy` 左移位比 python 慢?

转载 作者:行者123 更新时间:2023-11-28 22:15:34 25 4
gpt4 key购买 nike

我正在尝试对 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 在这个操作上比 numpy 快得多?有没有办法在 numpy 中获得可比的速度?

最佳答案

关于性能差异,这似乎是合乎逻辑的:您正在一个元素上应用矢量化移位。到达移位部分并更改 numpy 结构会产生很大的开销。 native 代码转换得更快。

好的,我在 google 上搜索了当您尝试在一个元素上执行此操作时收到的错误消息,即:

>>> 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

This is because the shift number is converted as a signed type and there is no signed integer type big enough to hold a uint64.

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

a << numpy.uint64(1)

(也许一劳永逸地构建“1”常量,并在所有代码中使用它来保存对象创建)

关于python - 为什么 `numpy` 左移位比 python 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52782511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com