python - 为什么与 np.int16 的相同操作相比,dtype np.int64 的操作要慢得多?

标签 python performance numpy

这就是我的意思 - a 是一个包含 1.000.000 个 np.int64 元素的向量,b 是一个包含 1.000 个元素的向量。 000 个 np.int16 元素:

In [19]: a = np.random.randint(100, size=(10**6), dtype="int64")

In [20]: b = np.random.randint(100, size=(10**6), dtype="int16")

不同操作的时间:

In [23]: %timeit a + 1
4.48 ms ± 253 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [24]: %timeit b + 1
1.37 ms ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [25]: %timeit a / 10
5.77 ms ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [26]: %timeit b / 10
6.09 ms ± 70.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [27]: %timeit a * 10
4.52 ms ± 198 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [28]: %timeit b * 10
1.52 ms ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

当 Numpy 必须在内存中创建一个新的临时结果时,我可以理解这种差异——底层 C 代码将不得不在内存中复制/填充更多数据。

但是我无法理解像下面这样就地赋值的这种差异:

In [21]: %timeit a[::2] = 111
409 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [22]: %timeit b[::2] = 111
203 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

您知道为什么即使对于 Numpy 不必创建副本/ View 的那些操作,它的速度也这么慢吗?

最佳答案

从内存中读取是有代价的。写入内存需要一些费用。您正在读取四倍多的数据,并写入四倍多的数据,而且工作比读/写内存快得多,以至于它实际上是 I/O 绑定(bind)。 CPU 只是比内存快(并且速度比随着时间的推移变得越来越极端);如果您正在进行内存密集型工作,较小的变量会运行得更快。

关于python - 为什么与 np.int16 的相同操作相比,dtype np.int64 的操作要慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518216/

相关文章:

Javascript/JSPerf 循环性能

android - 如何使用位置或加速度计或其他方式在 Android 应用程序中获得速度

python - 修改数组的值,其中相同大小的列表包含另一个列表的值

python - 在 Python 中按浮点值切片二维数组

python - 在 Python 2.7 中,为什么我要在其上调用方法时必须将 `int` 括在括号中?

python - 通过 web 服务进行 crm 集成的 evolution 插件

python - 使用一个字典作为另一个python字典的组合键(键值对)

python - 如何在特定时间之间以固定间隔在 python 中运行任务?

c# - 修改appSettings时性能不佳

python-3.x - Tensorflow 中 hstack 和 vstack 的对应物