Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】if分岐を辞書で書くとパフォーマンスは上がるのか?

こんにちは、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では、クエスト「アルゴリズムの評価と計算量」で説明しています。

Copyright ©2017- BeProud Inc. All rights reserved.