我正在尝试对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获得可比的速度?

#1楼 票数:4 已采纳

关于性能差异,似乎合乎逻辑:您正在对一个元素应用矢量化平移。 到达移位部分并更改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)

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

  ask by Paul Terwilliger translate from so

未解决问题?本站智能推荐:

2回复

为什么Python的numpy.polyval()这么慢?

更新脚本中存在错误。 我正在研究Julia&Mandelbrot集以及牛顿分形的可视化 - 为此我需要在复杂平面中计算很多值。 我可以使用我想要的任何类型的数学函数,但它足以用于多项式。 我需要计算函数/多项式的导数和值,所以我查看了numpy模块并找到了numpy.polyder
2回复

Python/Numpy - 掩码数组非常慢

我可以做些什么来加速 numpy 中的屏蔽数组? 我有一个非常低效的函数,我重新编写了它以使用掩码数组(我可以只掩码行而不是像我所做的那样进行复制和删除行)。 然而,我震惊地发现掩码函数慢了 10 倍,因为掩码数组要慢得多。 举个例子,下面是(masked 对我来说慢 6 倍以上):
4回复

为什么 numpy 比 python 慢? 如何让代码表现得更好

我将我的神经网络从纯 python 改写为 numpy,但现在它工作得更慢了。 所以我尝试了这两个功能: 时间 d = 1.77135205057 时间 e = 17.2464673758 Numpy 慢 10 倍。 为什么会这样以及如何正确使用 numpy?
2回复

numpy 数组赋值比 python 列表慢

麻木- 蟒蛇列表 - numpy 不应该是这里更快的版本吗? 这就是我的目标——
3回复

为什么NumPy有时比NumPy +普通Python循环慢?

这是基于2018-10问的这个问题 。 请考虑以下代码。 三个简单函数用于计算NumPy 3D阵列(1000×1000×1000)中的非零元素。 我机器上的运行时(Python 3.7。?,Windows 10,NumPy 1.16。?): 因此, f_2()比f_1()
4回复

为什么numpy本身“慢”?

鉴于这里的线程 似乎numpy不是超快计算的最理想选择。 有没有人知道在使用numpy进行数值计算时我们必须注意哪些开销?
3回复

使用numpy数组向左移1

Python确实可以左移大整数 但是NumPy似乎有一个问题: 有没有办法使用NumPy的left_shift操作来克服这个问题? 单独访问数组元素会产生相同的错误结果:
1回复

Python - 函数向量比在每个元素上调用 for 循环慢。 Numpy 比原生 Python 慢

我正在编写代码来执行瞬态模拟,为一天中的每一秒甚至整年调用一个函数。 我以为我找到了通过传递输入向量而不是调用 for 循环来加速代码的机会,但是,当我这样做时,我的代码运行速度较慢,我不明白为什么。 我希望向量只比一次调用 for 循环稍微慢一点,以实现我的目标加速。 你能帮忙解释和/或解决这