質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

526閲覧

pythonで、このプログラムを高速化したいです

shun_ya

総合スコア3

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/07/21 09:57

python

1β=0.48/10000 2γ=0.2857 3def 未感染者(n): 4 if n==0: 5 return 10000 6 else: 7 return 未感染者(n-1)-β*未感染者(n-1)*感染者(n-1) 8 9def 感染者(n): 10 if n==0: 11 return 2 12 else: 13 return 感染者(n-1)+β*未感染者(n-1)*感染者(n-1)-γ*感染者(n-1) 14 15def 回復者(n): 16 if n==0: 17 return 0 18 else: 19 return 回復者(n-1)+γ*感染者(n-1) 20 21for i in range (101): 22 a=未感染者(i) 23 print(i,'日目の未感染者は',a,'人です') 24 b=感染者(i) 25 print(i,'日目の感染者は',b,'人です') 26 c=回復者(i) 27 print(i,'日目の回復者は',c,'人です') 28 29```このコードを高速化したいのですが、何かいい方法はありますか? 30いろいろと調べてみたのですが、よくわからないので教えていただけると助かります。 31コードが動くことは確認済みです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/07/21 10:47

日本語のような2バイト文字を関数名や変数名に使うのは違和感があるので、英語にしていただけますか?
shun_ya

2020/07/21 11:32

わかりました。この質問は解決したので、次回から気を付けます。
guest

回答3

0

@functools.lru_cacheを使うのがお手軽です。関数の呼び出しをメモ化してくれます。

Python

1from functools import lru_cache 2 3β=0.48/10000 4γ=0.2857 5 6@lru_cache(100) 7def 未感染者(n): 8 if n==0: 9 return 10000 10 else: 11 return 未感染者(n-1)-β*未感染者(n-1)*感染者(n-1) 12 13@lru_cache(100) 14def 感染者(n): 15 if n==0: 16 return 2 17 else: 18 return 感染者(n-1)+β*未感染者(n-1)*感染者(n-1)-γ*感染者(n-1) 19 20@lru_cache(100) 21def 回復者(n): 22 if n==0: 23 return 0 24 else: 25 return 回復者(n-1)+γ*感染者(n-1) 26 27for i in range (101): 28 a=未感染者(i) 29 print(i,'日目の未感染者は',a,'人です') 30 b=感染者(i) 31 print(i,'日目の感染者は',b,'人です') 32 c=回復者(i) 33 print(i,'日目の回復者は',c,'人です')

投稿2020/07/21 10:49

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun_ya

2020/07/21 11:31

そんな関数が存在するんですね、教えていただきありがとうございます!
guest

0

ベストアンサー

もっと効率的な書き方があると思いますが、下記で鬼速度になりました!
再帰で遅くなっていると思います。再帰で計算なさっているところの過去のn-1の値は計算済みなのでlistに入れて
再利用することで高速化しています。

Python

1β=0.48/10000 2γ=0.2857 3 4list_未感染者 = [] 5list_感染者 = [] 6list_回復者 = [] 7 8def 未感染者(n): 9 if n==0: 10 list_未感染者.append(10000) 11 return 10000 12 else: 13 list_未感染者.append(list_未感染者[n-1]-β*list_未感染者[n-1]*list_感染者[n-1]) 14 return list_未感染者[n] 15 16def 感染者(n): 17 if n==0: 18 list_感染者.append(2) 19 return 2 20 else: 21 list_感染者.append(list_感染者[n-1]+β*list_未感染者[n-1]*list_感染者[n-1]-γ*list_感染者[n-1]) 22 return list_感染者[n] 23 24def 回復者(n): 25 if n==0: 26 list_回復者.append(0) 27 return 0 28 else: 29 list_回復者.append(list_回復者[n-1]+γ*list_感染者[n-1]) 30 return list_回復者[n] 31 32for i in range (101): 33 a=未感染者(i) 34 print(i,'日目の未感染者は',a,'人です') 35 b=感染者(i) 36 print(i,'日目の感染者は',b,'人です') 37 c=回復者(i) 38 print(i,'日目の回復者は',c,'人です')

投稿2020/07/21 10:50

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun_ya

2020/07/21 11:32

なるほど、ありがとうございます!
guest

0

p1.py

python3

1a, b, c = [10000, 2, 0] 2for i in range (1001): 3 print(f"{i: 4d}日目: 未感染者: {a: >8.2f} 人、感染者:{b: >8.2f} 人, 回復者: {c: >8.2f}") 4 a, b, c = [a * (1 - β * b), b * (1 + β * a - γ), c + γ * b] 5 6# 100日目: 未感染者: 3051.41 人、感染者: 0.68 人, 回復者: 6949.91 7# real 0m0.130s 8# user 0m0.056s 9# sys 0m0.062s 10 11# 1000日目: 未感染者: 3050.70 人、感染者: 0.00 人, 回復者: 6951.30 12# real 0m0.134s 13# user 0m0.062s 14# sys 0m0.053s

プログラムの末尾のコメントは、 for を 101 までにしたとき、1001 にしたときに
time python3 p1.py としてプログラムを走らせたときの最後の行の値と処理時間の出力を引用したものです。

投稿2020/07/22 10:49

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問