2016-05-16 11 views
0

私はleetcodeのPythonプログラミングを練習していました。なぜこれらの2つのコードが異なる効率(Python)を持っているのですか?

だから、これは問題です: https://leetcode.com/problems/reverse-vowels-of-a-string/

そして、これが私の答えです:

def reverseVowels(s): 
    result = list(s) 
    v_str = 'aeiouAEIOU' 
    v_list = [item for item in s if item in v_str] 
    v_list.reverse() 
    v_index = 0 
    for i, item in enumerate(s): 
     if item in v_list: 
      result[i] = v_list[v_index] 
      v_index+=1 
    return ''.join(result) 

結果:Time Limit Exceeded

そして、私は議論に非常に類似した答えが見つかりました:

def reverseVowels(s): 
    lst = list(s) 
    vowels_str = "aeiouAEIOU" 
    vowels_list = [item for item in lst if item in vowels_str] 
    vowels_list.reverse() 
    vowels_index = 0 
    for index, item in enumerate(lst): 
     if item in vowels_str: 
      lst[index] = vowels_list[vowels_index] 
      vowels_index += 1 
    return ''.join(lst) 

結果:Accepted

これはとても奇妙です。私はこれらの2つのコードが全く同じように思えると思います。

これらの違いは、パラメータだけです。

なぜこれらのコードが異なる結果をもたらすのか不思議です。

+1

これはPythonコードではありません。あなたは 'def'の外に' return'を持つことはできません。パラメータリストを含む**完全な定義を提供してください。また、コードを複数回実行してみてください...コードが速く実行され、時間制限が50%にすぎないケースがよくあります。 – Bakuriu

+0

@Bakuriu申し訳ありません、私は前にいくつかのコードを忘れています。あなたの思い出してくれてありがとう。私は自分のコードをたくさん試しました。しかし、それは常に私に同じ結果を与える.. –

答えて

3

は、より多くの議論のための関連の質問を参照してください。 まずものである:列挙(S)でiに対する

  • 、項目:索引項目の列挙に(LST)のため

    最初のケースでは、リストを反復処理と2番目の文字列では文字列を繰り返し処理します。ここではパフォーマンスの低下があるかもしれませんが、それは主要な問題ではありません。

    • 場合vowels_strのアイテム:
    • 場合v_listのアイテム:

    実行している時間が行く場所です。最初のケース(作業コード)では、長さが一定の母音からなる文字列内の文字を探します。 2番目のケースでは、文字列に含まれるすべての母音のリスト内の文字を検索します。これは、testで指定された文字列に応じて大きくなる可能性があります。

  • +0

    あなたは正しいです。私はちょうどそれを見つけた。 –

    1

    最初の文字列(s)を複数回繰り返しています。 2番目の方法では、リストに変換した後、そのリスト(lst)を反復処理しています。

    これが原因の正確な理由は、Pythonインタプリタの実装の詳細(確かに大きかったり、おそらく正確であることが重要です)です。両方のコードの間に2つの異なる行がありますWhy is it slower to iterate over a small string than a small list?

    関連する問題