質問: ``` β=0.48/10000 γ=0.2857 def 未感染者(n): if n==0: return 10000 else: return 未感染者(n-1)-β*未感染者(n-1)*感染者(n-1) def 感染者(n): if n==0: return 2 else: return 感染者(n-1)+β*未感染者(n-1)*感染者(n-1)-γ*感染者(n-1) def 回復者(n): if n==0: return 0 else: return 回復者(n-1)+γ*感染者(n-1) for i in range (101): a=未感染者(i) print(i,'日目の未感染者は',a,'人です') b=感染者(i) print(i,'日目の感染者は',b,'人です') c=回復者(i) print(i,'日目の回復者は',c,'人です') ``` このコードを高速化したいのですが、何かいい方法はありますか? いろいろと調べてみたのですが、よくわからないので教えていただけると助かります。 コードが動くことは確認済みです。
回答: もっと効率的な書き方があると思いますが、下記で鬼速度になりました! 再帰で遅くなっていると思います。再帰で計算なさっているところの過去のn-1の値は計算済みなのでlistに入れて 再利用することで高速化しています。 ``` β=0.48/10000 γ=0.2857 list_未感染者 = [] list_感染者 = [] list_回復者 = [] def 未感染者(n): if n==0: list_未感染者.append(10000) return 10000 else: list_未感染者.append(list_未感染者[n-1]-β*list_未感染者[n-1]*list_感染者[n-1]) return list_未感染者[n] def 感染者(n): if n==0: list_感染者.append(2) return 2 else: list_感染者.append(list_感染者[n-1]+β*list_未感染者[n-1]*list_感染者[n-1]-γ*list_感染者[n-1]) return list_感染者[n] def 回復者(n): if n==0: list_回復者.append(0) return 0 else: list_回復者.append(list_回復者[n-1]+γ*list_感染者[n-1]) return list_回復者[n] for i in range (101): a=未感染者(i) print(i,'日目の未感染者は',a,'人です') b=感染者(i) print(i,'日目の感染者は',b,'人です') c=回復者(i) print(i,'日目の回復者は',c,'人です') ```