第一個是沒有任何優化,打破i % j
替換,而第二個稍微更優化。當然,「Sieve of Eratosthenes」是最好的。這個函數按順序產生素數,但沒有上限。
簡單,沒有優化:
def simple_prime_list(num):
list_of_prime = (2,)
current_num = 2
is_prime = True
while len(list_of_prime) != num:
current_num += 1
for i in list_of_prime:
if current_num % i == 0:
is_prime = False
if is_prime == True:
list_of_prime += (current_num,)
#To reset the status
is_prime = True
return list_of_prime
通過不檢查所有的偶數和break
出的for循環時數是不是質略優化:
def prime_list(num):
list_of_prime = (2,)
current_num = 2
is_prime = True
while len(list_of_prime) != num:
current_num += 1
if current_num % 2 != 0:
for i in list_of_prime:
if current_num % i == 0:
is_prime = False
break
if is_prime == True:
list_of_prime += (current_num,)
#To reset the status
is_prime = True
return list_of_prime
嘗試測量2不同的運行時間:
import time
def measureTime(fn):
start = time.clock()
fn()
end = time.clock()
#return value in millisecond
return (end - start)*1000
print('Simple Prime List:', measureTime(lambda: simple_prime_list(1000)), 'ms')
print('Optimised Prime List:', measureTime(lambda: prime_list(1000)), 'ms')
輸出:
簡單總理名單:775.798毫秒
優化總理名單:69.48299999999996毫秒
謝謝你很多! :) –
@DavidBeck,不用擔心,不客氣。如果你真的想要一個有效的方法來生成素數,請使用Eratosthenes的篩子http://stackoverflow.com/a/23423821/2141635 –