上節課我們講了使用一行代碼就把程式的運算性能提升了将近10倍,在文章末尾老師給大家留了個思考,怎麼樣能夠使得程式的性能更加地優化呢?
在講授之前先給大家做下思想的引導。舉個例子,還是說列印100以内的質數,如果是要判斷100,利用上節課的思想,程式隻需要判斷100是否可以整除2就行了,這種類型的數字這麼判斷都是沒有問題的,那麼對于97來說呢,是不是還是需要從2~96進行判斷,但是結合實際情況來看,96有沒有可能被97整除,顯然是不合理的,95、94、93、、、等也都是如此。那該如何更加優化這個情況?
繼續跟着老師的思路往下走: 咱們先拿一個合數來舉個例子,假如說是36,他的因數都有什麼,1,36,2,18,3,12,4,9,6,有沒有發現它的因數都是成對出現的,除了6*6這麼一種情況。那其實咱們隻需要判斷j小于i的算術平方根的位置就沒必要再往下算了,但是為了避免漏掉像是6這種數字,還是要使得
j<=i**0.5
,就可以保證97這種情況進一步的優化了。代碼如下:
from time import*
begin=time()
i=2
while i<=10000:
flag = True
j=2
while j <= i ** 0.5:
if i % j == 0 :
flag = False
break
j += 1
if flag :
pass
i+=1
end=time()
print("程式運作的時長為:",end-begin,"秒")
執行結果為:
此時同樣判斷2~10000以内的質數就隻需要0.0418秒了。即使是将數字改為100000,程式執行也隻需要1.009秒。
看起來隻是三個符号的改變,卻讓程式的性能得到了極大的提升,這是對我們的數學能力和分析能力的雙重考核,但是現在想不出來這種方式也不需要擔心,随着後面的學習,會更加頻繁的進行這種思考,慢慢的就耳濡目染自己也學會了。
入門課程到這裡就基本結束了,在進行進階教程之前先來帶大家開發一個小遊戲:唐僧大戰白骨精!帶大家感受一下python的趣味之處。
第二十二節:遊戲的運作邏輯概述