Python比内存更有效的对象比减法

时间:2016-01-12 19:05:51

标签: python python-2.7 memory primes

我尝试编写一个函数,可以使用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;序列中的数字比使用集合的数字?我想知道因为我真的只需要减去两个数组,我不需要预防重复等等。

1 个答案:

答案 0 :(得分:1)

使用集合会对大型数据集产生问题,因为散列冲突的数量会显着增加,最重要的是会导致不必要的存储开销。

另一种解决方案是使用numpy掩码数组。数组中的索引是数字,该值表示它是否为素数。您可以通过将数字设为2 * index + 1进一步优化,以便只存储奇数。

这只是一个例子。使用大型筛子装置效率非常低。