质数(Prime Number)是指只能被 1 和自身整除的自然数,如 2、3、5、7 等。在算法题、密码学或数学计算中,高效生成质数至关重要。
Python 提供了多种方法来实现质数筛选,但不同方法的效率差异巨大。本文从 最基础的方法 开始,逐步介绍 优化技巧,最终给出 最优解,让你彻底掌握质数计算的精髓。
一、方法 1:最基础的暴力解法(适合新手)
遍历 2 到 n-1
,检查是否能被整除。
def is_prime(n):if n <= 1:return Falsefor i in range(2, n):if n % i == 0:return Falsereturn Trueprimes = [n for n in range(1, 1000) if is_prime(n)]
print(primes)
问题:效率低,时间复杂度 高,仅适用于小范围数据。
二、方法 2:优化暴力法(减少计算量)
定义优化后的函数,跳过偶数(除了 2),提升计算速度。
def is_prime_optimized(n):if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return Falsefor i in range(3, int(n ** 0.5) + 1, 2): # 只检查奇数if n % i == 0:return Falsereturn Trueprimes = [n for n in range(1, 1000) if is_prime_optimized(n)]
print(primes)
优点:比方法 1 快很多,至少排除了一半的数
三、方法 3:列表推导式法(简洁法)
这种方法代码简洁,思路清晰,同时不用使用其它的函数
nums = range(1, 1000)
primes = [num for num in nums if all(num % x != 0 for x in range(2, num))]
print(primes)
四、方法 4: filter法(思路清晰法)
定义一个过滤的函数is_prime(),然后用filter进行过滤,转化为列表后,打印出来。
nums = range(1, 1000)
def is_prime(num):for x in range(2, num):if (num % x) == 0:return Falsereturn True
primes = list(filter(is_prime, nums))
print(primes)
五、方法 5:filter + lambda(代码优化法)
把方法四中的函数转化为lambd函数,条件用and来连接起来,三行代码就可以实现。
nums = range(1, 1000)
primes = list(filter(lambda num: num > 1 and all(num % x != 0 for x in range(2, num), nums))
print(primes)
六、学后总结
利用Python的内置函数如filter、lambda可以减少代码冗余,提升运行速度。
处理序列时要结合filter,列表推导式,lambda匿名函数来改进算法,提升运行效率。
推荐第三种和第四种方法,思路清晰,易于理解。