<p>恐怕,用你在<code>answer(2000000000,10**4)</code>中的输入,你永远无法“及时”完成。在</p>
<p>通过改进内部循环,不必每次都更新<code>c</code>变量,并使用<code>xrange</code>而不是{<cd4>},这样可以显著提高速度:</p>
<pre><code>def answer(start, length):
val=0
c=0
for i in range(length):
for j in range(length):
if j < length-i:
val^=start+c
c+=1
return val
def answer_fast(start, length):
val = 0
c = 0
for i in xrange(length):
for j in xrange(length - i):
if j < length - i:
val ^= start + c + j
c += length
return val
# print answer(10, 20000)
print answer_fast(10, 20000)
</code></pre>
<p>探查器显示<code>answer_fast</code>的速度大约是后者的两倍:</p>
^{pr2}$
<p>但是如果你想要大提速(magnitute命令),你应该考虑在Cython中重写你的函数。在</p>
<p>以下是“cythonized”版本:</p>
<pre><code>def answer(int start, int length):
cdef int val = 0, c = 0, i, j
for i in xrange(length):
for j in xrange(length - i):
if j < length - i:
val ^= start + c + j
c += length
return val
</code></pre>
<p>在与上述相同的输入参数下,用时不到200毫秒,而不是20秒以上,这是100倍的加速。在</p>
<pre><code>> ipython
In [1]: import pyximport; pyximport.install()
Out[1]: (None, <pyximport.pyximport.PyxImporter at 0x7f3fed983150>)
In [2]: import script2
In [3]: timeit script2.answer(10, 20000)
10 loops, best of 3: 188 ms per loop
</code></pre>
<p>输入58毫秒:</p>
<pre><code>In [5]: timeit script2.answer(2000000000,10**4)
10 loops, best of 3: 58.2 ms per loop
</code></pre>