<p>我看不出你的复制尝试有什么错,但请记住,这些幻灯片都是2010年的,从那时起numpy已经发生了很大的变化。根据<a href="https://github.com/numpy/numpy/releases" rel="nofollow">dates of numpy releases</a>,我猜弗朗西斯可能在用v1.5。在</p>
<p>使用此脚本对第v行列和进行基准测试:</p>
<pre><code>#!python
import numpy as np
import timeit
print "numpy version == " + str(np.__version__)
setup = "import numpy as np; a = np.random.randn(4000, 4000)"
rsum = "a[1, :].sum()"
csum = "a[:, 1].sum()"
nloop = 1000
nrep = 3
print "row sum:\t%.3f us" % (
min(timeit.repeat(rsum, setup, repeat=nrep, number=nloop)) / nloop * 1E6)
print "column sum:\t%.3f us" % (
min(timeit.repeat(csum, setup, repeat=nrep, number=nloop)) / nloop * 1E6)
</code></pre>
<p>我检测到numpy v1.5的列和速度下降了大约50%:</p>
^{pr2}$
<p>相比之下,v1.8.1版本的速度下降了30%,您使用的是:</p>
<pre><code>$ python sum_benchmark.py
numpy version == 1.8.1
row sum: 12.108 us
column sum: 15.768 us
</code></pre>
<p>有趣的是,在最近的numpy版本中,这两种类型的缩减实际上都有点慢。我必须深入研究numpy的源代码
去理解为什么会这样。在</p>
<h2>更新</h2>
<ul>
<li>我在2.0GHz的四核i7-2630qmcpu上运行ubuntu14.04(kernelv3.13.0-30)。两个版本的numpy都是pip安装的,并使用GCC-4.8.1进行编译。在</li>
<li>我意识到我最初的基准测试脚本并不是完全自解释的-您需要将总时间除以循环数(1000)才能得到每次调用的时间。在</li>
<li>它也是<a href="https://docs.python.org/2/library/timeit.html#python-interface" rel="nofollow">probably makes more sense to take the minimum across repeats rather than the average</a>,因为这更可能代表执行时间的下限(在这个下限上,您将得到由于后台进程等原因而产生的变化)。在</li>
</ul>
<p><strong>我已经相应地更新了我的脚本和上面的结果</strong></p>
<p>我们还可以通过为每个调用创建一个全新的随机数组来消除跨调用缓存的任何效果(临时局部性)——只需将<code>nloop</code>设置为1,将<code>nrep</code>设置为一个相当小的数字(除非您真的很喜欢看油漆干燥),比如10。在</p>
<p>在4000x4000阵列上的<code>nloop=1</code>,<code>nreps=10</code>:</p>
<pre><code>numpy version == 1.5.0
row sum: 47.922 us
column sum: 103.235 us
numpy version == 1.8.1
row sum: 66.996 us
column sum: 125.885 us
</code></pre>
<p>这有点像,但我仍然无法真正复制弗朗西斯的幻灯片所显示的巨大效果。也许这并不令人惊讶,但是-效果可能非常依赖于编译器、体系结构和/或内核。在</p>