求素數應該是每個程式設計者都會遇到的一道題目
筆者剛開始學程式設計時,只是根據素數定義將其實現
定義:在大於1的自然數中,除了1和它本身以外不再有其他因數
上面的%%timeit為ipython自帶的魔法方法,用於簡單測試執行時間
結果時間為51.4 ms ± 1.75 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
但這樣做帶耗時間,雙層迴圈會跑很久,後面便試著簡化
筆者首先想到的是將偶數去除,然後第二次迴圈判斷上屆可以寫成int(i/2)
結果為36.5 ms ± 2.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
後面又想是否還能優化,對上屆int(i/2)的判斷是否可以改進
發現9=33,16=44 對於大於其0.5次冪的數都可以不用判斷了,應為前面已經判斷玩與之對應的其他因子了,將上界改為int(i**0.5)+1
筆者當年也就改寫到這一步,但今天無意中看到素數的性質中有一條
乙個數如果為合數,則可以分解為幾個素數的積
於是想到這道題目,想著是否可以利用這個性質來進一步優化**,最後完成如下
結果為2.01 ms ± 149 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
瞬間效率就大大上公升,這還只是求1000以內
如果是1萬,十萬,一百萬……所節省的時間就尤為可觀
果然演算法在寫**中是何等重要
筆者現在就優化到此,如果有更好的求素數的方法,希望大家提出。
一些優化演算法
1.內點法介紹 interior point method dymodi的專欄 csdn部落格 2.column generation 列生成 演算法 從下料問題看整數規劃中的列生成方法 附gurobi求解器源 知乎 3.群演算法 遺傳演算法ga 最優化演算法之粒子群演算法 pso 模擬退火演算法s...
Mysql的一些簡單優化
1.5.6以上預設innodb,其他預設搜尋引擎為myisam 2.在對於金融問題資料誤差,採用decimal,獲取採用bigint型別存 金額 1000 or 10000 or 100000,避免使用浮點去進行計算 3.設計索引的原則 1 最適合索引的列是出現在where子句中的列,或連線子句中指...
一些簡單的演算法
氣泡排序,比如你有五個數 3 4 2 1 0 其原理就是用沒個數和 其他數進行比較 下面我們來書寫每一輪的數值 第一輪 3 4 2 得出佇列 2 4 3 1 0 2 1 0 得出佇列 1 4 3 2 0 得出佇列 0 4 3 2 1 第二輪 4 3 得出佇列 0 3 4 2 1 3 2 1 得出佇列...