前回の年越しの瞬間、何してた?

3つ以上存在する要素がないか判定します

def isPossibleToSplit(self, nums: List[int]) -> bool:
c = defaultdict(int)
for i in nums:
c[i] += 1
if c[i] > 2:
return False
return True

としました。でも、足して3になたらFalseよりも
2のものにたそうとするときにFalseのほうが早いと思って


def isPossibleToSplit(self, nums: List[int]) -> bool:
c = defaultdict(int)
for i in nums:
if c[i] == 2:
return False
c[i] += 1
return True

としました。そしたらに個目のほうが遅くなりました。なんでですか??
ifをみる階数も同じだとおもいませんか?

A 回答 (3件)

ひとつめのコードだと、内部処理の都合で


c[i] のアクセスが 1 回で済むんじゃない?
python のリスト参照にどんだけコストがかかるのかは知らんけど。
    • good
    • 0
この回答へのお礼

助かりました

お礼日時:2024/05/19 16:47

なんでこんなC言語みたいなコードを書かないといけないかわかないんだけど、


C言語の場合、前者は
++ c[i] > 2
って分岐条件でかけるけど、
後者はc[i] ++ == 2とは書けないよね、って思う。
実際にはc[i]==2の際に、c[i]を足さずにreturnするから。

そう考えると、後者は前者みたいなシンプルな構造に最適化出来ないんじゃねえかな。

まあ本当に遅いのかどうかも知らんし、正直理由とかどうでもいい気がする。

後関係ないかもだけど、単にPythonは全てがオブジェクトだから、比較が他言語に比べて遅い可能性がある。
    • good
    • 0
この回答へのお礼

ありがとう

お礼日時:2024/05/19 16:48

厳密にいうと、最初から、3つ以上存在する場合、2つ目のコードでは、一致しなくなるので、



if c[i] == 2:

を、

if c[i] >= 2:

に変更すれば、早くなるかもしれません。
    • good
    • 0
この回答へのお礼

ありがとう

ありがとうございます。

お礼日時:2024/05/18 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A