こんにちは、PyQサポートです。
今回は、Pythonの条件判定の書き方について紹介します。
質問:if分岐ではなく、辞書を利用して条件判定を書くとパフォーマンスは上がるのでしょうか?
以下のじゃんけんの勝敗判定をif分岐ではなく、辞書を利用して書くとパフォーマンスは上がるのでしょうか?
# playerとcomのそれぞれに、「グー」「チョキ」「パー」のいずれかが入っています。 # 勝敗判定の結果は、resultに入ります。 # あいこの条件 if player == com: result = 'あいこ' # グーの条件 elif player == 'グー': if com == 'チョキ': result = 'あなたの勝ち' else: result = 'コンピューターの勝ち' # チョキの条件 elif player == 'チョキ': if com == 'パー': result = 'あなたの勝ち' else: result = 'コンピューターの勝ち' # パーの条件 else: if com == 'グー': result = 'あなたの勝ち' else: result = 'コンピューターの勝ち'
回答 if分岐より辞書のほうがわずかに速いと思われますが、実際に計測して判断することが重要になります
辞書を使う場合、下記のようになります。
dct = { ("グー", "グー"): "あいこ", ("グー", "チョキ"): "あなたの勝ち", ("グー", "パー"): "コンピューターの勝ち", ("チョキ", "グー"): "コンピューターの勝ち", ("チョキ", "チョキ"): "あいこ", ("チョキ", "パー"): "あなたの勝ち", ("パー", "グー"): "あなたの勝ち", ("パー", "チョキ"): "コンピューターの勝ち", ("パー", "パー"): "あいこ", } result = dct[(player, com)]
if分岐の連続と辞書を利用した場合では、辞書のほうがわずかに速いと思われますが、全体の実行時間からするとごくわずかの差になります。
とはいえ、「じゃんけんの勝敗」を何度も実行する場合は「わずかの差」が積もって無視できない差になることもありえます。
パフォーマンスを気にする場合は、実際に計測して判断することが重要になります。
時間計測は、PyQのクエスト「timeitライブラリー 」で学習できます。
もし、じゃんけんの種類(グー、チョキ、パー)がもっとたくさんある場合も、パフォーマンスに影響が出ます。
たとえば、じゃんけんの種類がN種類ある場合、if文による計算時間はNに比例します。一方、辞書を利用した場合は(ほとんど)Nによらず一定の計算時間になります。
このような考え方は、すこし難しいですがアルゴリズムの計算量といいます。
PyQでは、クエスト「アルゴリズムの評価と計算量」で説明しています。