【发布时间】:2019-03-17 20:40:14
【问题描述】:
我正在尝试对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 中获得相当的速度?
【问题讨论】:
-
您正在对一个元素应用矢量化移位。到达 shift 部分并更改 numpy 结构会产生很大的开销。本机代码转换得更快。但是,如果您进行 10000 次轮班,那将会改变
-
您建议如何加快速度?
a << 1不适用于 numpy uint64,除非对象在数组中 -
如果 Numba 适合您,您也可以尝试类似的方法。 stackoverflow.com/a/45070947/4045774