繁体   English   中英

为什么numpy在左移时比python慢​​?

Why is `numpy` slower than python for left bit shifts?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试对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 个回复

关于性能差异,似乎合乎逻辑:您正在对一个元素应用矢量化平移。 到达移位部分并更改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”常量,并在所有代码中使用它来保存对象的创建)

1 为什么numpy比纯python慢​​?

我尝试在python中实现高斯消除。 我期望使用numpy比纯python更快。 因此,结果,“向后消除”的结果是可以理解的。 当我在'前向消除'中使用100X100矩阵时,numpy比纯Python更快。 但是,当我使用1000X1000矩阵时,它在“前向消除”中没有意义。 ...

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

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

3 numpy的下标速度比python慢​​?

我刚刚开始研究numpy,以加快从PIL图像中提取数据的速度。 显然,当您可以使用numpy运算符时,它与普通的python代码相比非常优越(在我的基准测试中快200倍)。 我预计在numpy数组上的下标速度也将比在Python列表上快,但是我发现它的速度要慢2倍。 我可以理解它是 ...

5 Python/Numpy - 掩码数组非常慢

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

10 vim ultisnips 在可视模式下左移时会增加延迟

我最近在neovim上安装了ultisnips插件,但遇到了问题: 当我启用ultisnips ,当我在视觉模式下按&lt;时,会出现延迟,直到我的行左移,但我使用&gt;的右移立即起作用。 如果我运行:verbose map &lt; ,我会看到以下内容 从我所见,绑定来自片段文件,它们不 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM