Python Eratosthenes 筛算法优化

标签 python optimization primes sieve-of-eratosthenes

我正在尝试实现埃拉托色尼筛法。输出似乎是正确的(减去需要添加的“2”),但如果函数的输入大于 100k 左右,它似乎需要过多的时间。我可以通过哪些方式优化此功能?

def sieveErato(n):
     numberList = range(3,n,2)

     for item in range(int(math.sqrt(len(numberList)))):
            divisor = numberList[item]
            for thing in numberList:
                    if(thing % divisor == 0) and thing != divisor:
                            numberList.remove(thing)
    return numberList

最佳答案

您的算法不是埃拉托色尼筛法。您执行试验除法(模数运算符)而不是像埃拉托色尼 2000 多年前所做的那样交叉乘数。 Here是对真正筛选算法的解释,下面显示的是我简单、直接的实现,它返回不超过 n 的素数列表:

def sieve(n):
    m = (n-1) // 2
    b = [True]*m
    i,p,ps = 0,3,[2]
    while p*p < n:
        if b[i]:
            ps.append(p)
            j = 2*i*i + 6*i + 3
            while j < m:
                b[j] = False
                j = j + 2*i + 3
        i+=1; p+=2
    while i < m:
        if b[i]:
            ps.append(p)
        i+=1; p+=2
    return ps

我们只筛选奇数,在 n 的平方根处停止。 j 上奇怪的计算映射在被筛选的整数 3、5、7、9 ...... 和 b 中的索引 0、1、2、3 ...... 位数组。

您可以在 http://ideone.com/YTaMB 上看到这个函数的运行情况。 ,它在不到一秒的时间内计算出一百万个素数。

关于Python Eratosthenes 筛算法优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043791/

相关文章:

python - 如何修复 Sublime Text 3 Python 构建错误?

java - 拥有大量小方法是否有助于 JIT 编译器优化?

c++ - 如何使msvc向量化浮点加法?

javascript - 如何选择具有复杂 ID 的元素

sql-server - TSQL程序求最大素数

haskell - 检查一个整数(或整数列表的所有元素)是否为质数

ruby - 正则表达式 - 这个用于素数检测的正则表达式的复杂性是多少?

python - 未解析的外部符号构建 Python C 扩展

python - 从数据帧中提取子集

python - 使用批处理文件在Python中嵌入Youtube-DL