这就是我的意思 - 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/