擅长:python、mysql、java
<p>您没有完全实现正确的算法:</p>
<p>在第一个示例中,<code>primes_sieve</code>没有维护要删除/取消设置的素性标志列表(如算法中所示),而是连续调整整数列表的大小,这非常昂贵:从列表中删除一个项需要将所有后续项下移一个。</p>
<p>在第二个例子中,<code>primes_sieve1</code>维护了素性标志的<em>字典</em>,这是朝着正确方向迈出的一步,但它以未定义的顺序在字典上迭代,并冗余地删除因子中的因子(而不只是素数的因子,如在算法中)。您可以通过对键进行排序并跳过非素数(这已经使它的速度提高了一个数量级)来解决这个问题,但是直接使用列表仍然有效得多。</p>
<p>正确的算法(使用列表而不是字典)类似于:</p>
<pre><code>def primes_sieve2(limit):
a = [True] * limit # Initialize the primality list
a[0] = a[1] = False
for (i, isprime) in enumerate(a):
if isprime:
yield i
for n in range(i*i, limit, i): # Mark factors non-prime
a[n] = False
</code></pre>
<p>(请注意,这还包括在素数的平方(<code>i*i</code>)而不是其双精度开始非素数标记的算法优化。)</p>