Python 比减法设置更节省内存的对象

Python more memory efficient object than set for subtraction

我正在尝试编写一个函数,该函数可以使用 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 仅通过检查因子的数量来计算低于限制的素数,而 multiples 计算低于限制的数字的所有倍数。

将非常大的限制传递给 primes,我将大集合创建为 limits 平方根以下所有素数的 "strike out" 倍数。

有没有比使用集合更有效地 "strike out" 从序列中提取数字的方法?我想知道因为我真的只需要减去两个数组,我不需要防止重复等

对于大型数据集,使用集合会有问题,因为散列冲突的数量会显着增加,除此之外还会产生不必要的存储开销。

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

这只是一个例子。大筛子用套子效率会很低