<p>让我们在代码中添加一个progressbar,这样我们就可以很快找到答案。你知道吗</p>
<pre><code>import progressbar
p = progressbar.ProgressBar(widgets=[progressbar.SimpleProgress(), ' ', progressbar.ETA()], maxval=10002)
p.start()
while len(primes) < 10002:
p.update(len(primes))
if primeornot(m) is True:
primes.append(m)
m=m+1
else:
m=m+1
</code></pre>
<p>通过这样做,我们可以看到您当前的实现对于这个问题来说太慢了。你需要一个更好的算法。一般来说,我建议实现类似<a href="https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" rel="nofollow noreferrer">Sieve of Eratosthenes</a>的东西。你知道吗</p>
<h2>或者</h2>
<p>另一方面,也许我们可以对你的程序做一个小的调整来解决这个问题。让我们看看<code>primeornot()</code>函数。你知道吗</p>
<p>一旦我们找到一个数的实际除数,我们就不需要测试剩余的可用数。相反,我们可以早点回来。所以我们可以:</p>
<pre><code>def primeornot(n):
for number in xrange(2,n):
if n % number == 0:
return False
return True
</code></pre>
<p>另外,我们知道一个数的最大可能除数是<a href="https://math.stackexchange.com/questions/102755/greatest-prime-factor-of-n-is-less-than-square-root-of-n-proof">square root of that number</a>。所以我们也可以添加优化:</p>
<pre><code>def primeornot(n):
maximum = int(math.sqrt(n)) + 1
for number in xrange(2, maximum):
if n % number == 0:
return False
return True
</code></pre>
<p>这会导致代码在不到一秒钟的时间内运行,并生成正确的答案。你知道吗</p>