擅长:python、mysql、java
<p>有趣。我可以重现塞巴斯蒂安的表演:</p>
<pre><code>In [21]: np.__version__
Out[21]: '1.8.1'
In [22]: a = np.random.randn(4000, 4000)
In [23]: %timeit a[:, 1].sum()
100000 loops, best of 3: 12.4 µs per loop
In [24]: %timeit a[1, :].sum()
100000 loops, best of 3: 10.6 µs per loop
</code></pre>
<p>但是,如果我尝试使用更大的阵列:</p>
^{pr2}$
<p><em>但是</em>,如果我再试一次:</p>
<pre><code>In [28]: a = np.random.randn(10000, 10000)
In [29]: %timeit a[:, 1].sum()
10000 loops, best of 3: 64.4 µs per loop
In [30]: %timeit a[1, :].sum()
100000 loops, best of 3: 15.9 µs per loop
</code></pre>
<p>所以,不确定这是怎么回事,但这种抖动可能是由于缓存效应。也许新的体系结构在预测模式访问方面更明智了,因此可以更好地进行预取?在</p>
<p>无论如何,为了便于比较,我使用的是Numpy1.8.1、LinuxUbuntu14.04和一台i5-3380mCPU@2.90GHz的笔记本电脑。在</p>
<p>编辑:在考虑过这一点之后,是的,我会说第一次执行sum时,列(或行)是从RAM中获取的,但是第二次操作运行时,数据在缓存中(对于行和列两种版本),所以它执行的速度很快。由于时间花费最少的运行,这就是为什么我们看不到时间上的巨大差异。在</p>
<p>另一个问题是为什么我们有时会看到差异(使用timeit)。但是缓存是一种奇怪的野兽,尤其是在一次执行多个进程的多核机器中。在</p>