質數(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匿名函數來改進算法,提升運行效率。
推薦第三種和第四種方法,思路清晰,易于理解。