如何优化Python查找指定数值内所有素数的代码以提升大数值下运行效率
现有代码核心问题
- 素数筛选逻辑错误:当前代码的判定规则不符合素数定义,输出的素数列表本身存在大量漏判、错判问题
- 冗余IO拖慢速度:循环内的
print(number)属于IO操作,耗时远高于数值计算,是明显的性能拖累项 - 校验逻辑完全冗余:既遍历了所有小于当前数的整数做取余判断,又额外嵌套了一层全量已找到素数的遍历统计,做了大量无意义计算
- 没有利用素数校验的特性:判断一个数是否为素数,只需要校验到该数的平方根即可,不需要遍历所有更小的数值
优化方案
- 先修正素数判定逻辑,符合「只能被1和自身整除的大于1的正整数」的定义
- 去掉无意义的循环内打印操作,避免不必要的IO开销
- 跳过所有偶数校验:除了2之外所有偶数都不是素数,遍历步长设为2直接减少一半计算量
- 缩小校验范围:判断
n是否为素数时,只需要用已经找到的、小于等于√n的素数校验即可,只要有一个素数能整除n就直接判定为非素数,终止校验 - 大数值场景优先用埃拉托斯特尼筛法:时间复杂度为O(n log log n),远高于逐个校验的O(n√n),数值越大性能优势越明显
优化后的逐个校验版本
适合不确定上限、需要动态生成素数的场景:
import time import math t0 = time.time() prime_list = [2] max_limit = 1000 # 从3开始遍历,步长为2跳过所有偶数 for n in range(3, max_limit + 1, 2): is_prime = True sqrt_n = math.isqrt(n) for p in prime_list: # 素数超过平方根就不需要继续校验了 if p > sqrt_n: break if n % p == 0: is_prime = False break if is_prime: prime_list.append(n) print(prime_list) t1 = time.time() print(f"总耗时:{t1 - t0}s")
大数值场景最优的埃氏筛版本
适合上限明确的场景,100万以内素数筛选耗时不到0.1秒:
import time t0 = time.time() max_limit = 1000 # 初始化标记数组,下标对应数值,值表示是否为素数 is_prime = [True] * (max_limit + 1) is_prime[0] = is_prime[1] = False for i in range(2, int(max_limit ** 0.5) + 1): if is_prime[i]: # 批量标记i的所有倍数为非素数 is_prime[i*i : max_limit+1 : i] = [False] * len(is_prime[i*i : max_limit+1 : i]) prime_list = [idx for idx, val in enumerate(is_prime) if val] print(prime_list) t1 = time.time() print(f"总耗时:{t1 - t0}s")
以上两个版本的输出结果完全符合素数定义,1000以内素数筛选的性能比原有代码快100倍以上,数值越大性能提升幅度越高。
内容的提问来源于stack exchange,提问作者Ajin
相关产品推荐
相关产品推荐

