看板 Python 關於我們 聯絡資訊
想請教 若我想利用python中的套件sympy 去計算出某遞迴數列的理論值 遞迴數列定義如下: a_{n+2}=2*sin(15度)*a_{n+1}-a_n a_1=2 a_2=2*sin(15度) (不太確定套件這樣用是否適合,總之跑得動,但要求14項數 之後的取值,就會卡住不動) 碼如下: from sympy import * memo = {0:2, 1: (sqrt(6)-sqrt(2))/2} def sinus_seq(n): if not n in memo: memo[n] = (2*(sqrt(6)-sqrt(2))/4)*sinus_seq(n-1)-sinus_seq(n-2) return memo[n] for i in range(12): print("c[{}]={}".format(i,simplify(sinus_seq(i)))) 執行時,當我把倒數第二列的range(k)改為k=15時, 利用計算時間的套件 顯示出來的訊息 CPU times: total: 4min 8s 而k=12的訊息為CPU times: total: 12.7 s 數字k更大k>15,就會卡住不動了 想請教有沒有可以改善更有效率的output出更多項的方法??例如要跑到第3000項數列值 先謝謝高手願意分享! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.207.148 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1688271340.A.088.html
chang1248w: 為啥是用dict? 07/02 13:36
lycantrope: 要先simplify後才存入memo 07/02 13:37
lycantrope: 可以用functools.lru_cache來達成你想要的效果 07/02 13:41
lycantrope: https://pastebin.com/ShZRPJey 07/02 13:50
lycantrope: if n==0: return 2 07/02 14:08
shingai: 也太神奇了吧..原來有這種東西可以用 To 1F用dic不好嗎? 07/02 18:47
mantour: 即然算第n項遞迴會把比n小的每一項都跑過一次,是不是直 07/03 06:23
mantour: 接從N=1開始往上建表就好 07/03 06:23
lycantrope: 你也可以cache simplify會更快 07/03 10:58
lycantrope: https://pastebin.com/4PuUesfM 07/03 10:59
shingai: 3Q~使用裝飾器好像會拖速 07/03 11:47
shingai: simplify = lru_cache(simplify)這個動作怎麼想到的? 07/03 11:49