<p>如果希望在全局内存中保留素数以加速多个调用,则需要确保正确填充素数列表,即使在以随机顺序调用函数时也是如此。is_prime2()存储和使用素数的方法假设,例如,它在用343调用之前先用7调用。如果不是,343将被视为素数,因为7还不在素数列表中</p>
<p>所以函数必须计算并存储所有素数,直到√49才能响应is_prime(343)呼叫</p>
<p>为了快速建立素数表,埃拉托斯烯筛是最快的方法之一。但是,由于您事先不知道需要多少素数,因此无法预先分配筛选的位标志。你所能做的就是使用滚动的筛子窗口逐块向前移动(比如说一次1000000位)。当一个超过最大素数的数字被请求时,你只需逐块生成更多的素数,直到你有足够的响应为止</p>
<p>此外,由于您要构建一个素数列表,您不妨将其设置为一个集合,并检查请求的数字是否在其中以响应函数调用。这将需要生成比除法所需的素数更多的素数,但出于加速后续调用的精神,这不应该是一个问题</p>
<p>下面是使用该方法的isPrime()函数的示例:</p>
<pre><code>primes = {3}
sieveMax = 3
sieveChunk = 1000000 # must be an even number
def isPrime(n):
if not n&1: return n==2
global primes,sieveMax, sieveChunk
while n>sieveMax:
base,sieveMax = sieveMax, sieveMax + sieveChunk
sieve = [True]* sieveChunk
for p in primes:
i = (p - base%p)%p
sieve[i::p]=[False]*len(sieve[i::p])
for i in range(0, sieveChunk,2):
if not sieve[i]: continue
p = i + base
primes.add(p)
sieve[i::p] = [False]*len(sieve[i::p])
return n in primes
</code></pre>
<p>在第一次调用未知的prime时,它将比divisions方法执行得慢,但随着prime列表的建立,它将提供更好的响应时间</p>