<p>在Python中提倡使用<code>for i in xrange(...)</code>风格的循环结构背后的基本原理是什么?对于简单的整数循环,开销的差别是巨大的。我用两段代码进行了一个简单的测试:</p>
<p>文件<code>idiomatic.py</code>:</p>
<pre><code>#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
</code></pre>
<p>文件<code>cstyle.py</code>:</p>
^{pr2}$
<p>分析结果如下:</p>
<pre><code>bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
</code></pre>
<p>我能理解为什么Pythonic版本比较慢——我想这与调用xrange N次有很大关系,如果有办法倒带生成器,这可能会被消除。然而,由于执行时间上的差异,为什么要使用python版本呢?在</p>
<p><strong>编辑:</strong>我使用Martelli先生提供的代码再次进行了测试,结果现在确实更好了:</p>
<p>我想我可以从这里列举一些结论:</p>
<p>1)<em>模块范围内的大量代码是个坏主意,</em>即使代码被封装在<code>if __name__ == "__main__":</code>块中。在</p>
<p>2)*奇怪的是,将属于<code>thebadone</code>的代码修改为我不正确的版本(让y在不重置的情况下增长)在性能上几乎没有差别,甚至对于更大的M和N值也是如此</p>
<p>你忘了在内环后将y重置为0。在</p>
<pre><code>#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
while x < N:
while y < M:
y += 1
x += 1
y = 0
</code></pre>
<p>ed:20.63s修复后与6.97s使用xrange</p>