np.array中行提取的时间

时间:2018-05-14 19:24:45

标签: python numpy row extraction timeit

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

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

23纳秒

%timeit x[a]

1.7微秒

虽然x [a]是一个较小的数组,但需要更多时间才能到达。你能知道是什么原因引起的吗?如果不是x,我会看到类似的结果,我要求x.T.dot(x)和x [a] .T.dot(x [a])。

2 个答案:

答案 0 :(得分:2)

%timeit x次与x无关的时间。它什么都不做很容易。

%timeit x[a]次实际使用x执行操作需要多长时间,动态计算索引操作的含义,然后将20个指定的行复制到新数组中。做事比做什么都困难。

答案 1 :(得分:2)

虽然您的标题测试用例存在缺陷,x只是一个参考,但您的观察结果不那么极端

>>> timeit(lambda: x[a], number=1000000)
1.8212362979538739
>>> timeit(lambda: x.copy(), number=1000000)
1.2187692462466657

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

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