我尝试编写一个函数,可以使用Sieve of Eratosthenes找到低于某个非常大的数字的所有素数。我写了这个函数:
def primes(limit):
#efficient method for finding large primes
l=set()
i=1
while i<limit+1:
l.add(i)
i+=2
s=int(math.sqrt(limit))
#recur until sqrt is small
if s<=1000:
ps=smallprimes(s)
else:
ps=primes(s)
for p in ps:
l-=set(multiples(p,limit+1)[1:])
return [2]+(list(l)[1:])
其中smallprimes仅通过检查因子的数量来计算低于限制的素数,并且倍数计算低于限制的数字的所有倍数。
在primes
传递了非常大的限制时,我创建了大型集合,以便&#34;删除&#34; limits
平方根以下所有素数的倍数。
是否有一种更有效的方式来罢工&#34;序列中的数字比使用集合的数字?我想知道因为我真的只需要减去两个数组,我不需要预防重复等等。
答案 0 :(得分:1)
使用集合会对大型数据集产生问题,因为散列冲突的数量会显着增加,最重要的是会导致不必要的存储开销。
另一种解决方案是使用numpy
掩码数组。数组中的索引是数字,该值表示它是否为素数。您可以通过将数字设为2 * index + 1
进一步优化,以便只存储奇数。
这只是一个例子。使用大型筛子装置效率非常低。