在Python列表中存储大量数据

时间:2017-09-26 10:44:30

标签: python algorithm sieve-of-eratosthenes

我想要一个程序来生成最多10 ^ 9的素数。 我正在使用Sieve of Eratosthenes在python中实现它,但是当我尝试10 ^ 9时我遇到了内存错误。它工作正常,直到10 ^ 7。 这是我正在使用的代码

def prime(n):
    p=[True]*(n+1)
    p[0]=p[1]=False

    for i in range(int(n**0.5)+1):
        if p[i]:
            for j in range(i*i, n+1, i):
                p[j] = False

    for i in range(n+1):
        if p[i]:
            yield i

我使用的是Windows 10,内存为6GB

1 个答案:

答案 0 :(得分:1)

只需存储素数本身就可以获得巨大的加速,而不是在每个特定的素数上存储真或假。这将大大简化您的程序,它还应该允许您处理更大的值。

替代方法

尝试编译素数列表,然后仅测试那些质数以查看是否有任何除数。这明显更快,我在这里没有内存问题,我尝试了素数(655360002)(我在维基百科上查找)没有问题。

def prime(n):

    found_primes = []
    for number in range(2, int(n**0.5)+1):

        number_is_prime = True

        # The new number can only be divisible by other primes
        for divisor in found_primes:
            if number % divisor == 0:
                number_is_prime = False
                break

        if number_is_prime:
            found_primes.append(number)


    # Now that we have a list of primes, we test our number against them
    for prime in found_primes:
        if n % prime == 0:
            return False


    # IF we tried all primes, then we must be prime
    return True