np.array 中的行提取时间

Time for row extraction in np.array

在优化 python 中的部分代码时,我观察到以下内容:

x = np.random.randn(100, 20)
a = np.arange(20)
%timeit x

23 纳秒

%timeit x[a]

1.7 微秒

虽然 x[a] 是一个较小的数组,但它需要更多的时间才能到达。请问您知道是什么原因造成的吗?如果我要求 x.T.dot(x) 和 x[a].T.dot(x[a]).

而不是 x,则会观察到类似的结果

%timeit x 倍于 x 无所事事的时间。什么都不做很容易。

%timeit x[a] 倍实际用 x 做某事所花费的时间,那件事正在动态地计算出索引操作的含义,然后将 20 个指定的行复制到一个新数组中。做事比什么都不做要难得多

虽然您的标题测试用例存在缺陷,x 只是一个参考,但您的观察结果对于

来说并不那么极端
>>> timeit(lambda: x[a], number=1000000)
1.8212362979538739
>>> timeit(lambda: x.copy(), number=1000000)
1.2187692462466657

我们在这里看到的是高级索引的成本。 "Conventional" 切片索引成本显着降低但仍有开销:

>>> np.all(x[:20] == x[a])
True
>>> timeit(lambda: x[:20].copy(), number=1000000)
0.7956113098189235