2016-05-16 4 views
0

Я практиковал программирование на Python на leetcode.Почему эти два почти одинаковых кода имеют разные эффективные (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

Это настолько странно. Я думаю, что эти два кода выглядят точно так же.

Разница в них - не что иное, как параметры.

Мне любопытно, почему эти коды вызывают отличные результаты.

+1

Это не код питона. У вас не может быть 'return' вне' def'. Укажите ** полные ** определения, включая списки параметров. Также: попробуйте запустить код несколько раз ... часто бывает, что код работает так же быстро и передает ограничение времени только 50% времени. – Bakuriu

+0

@Bakuriu Извините, я пропустил код раньше. Спасибо за ваше напоминание. Я много раз пробовал свой код. Но это всегда дает мне тот же результат. –

ответ

3

Есть две разные линии между двумя кодами. Первый:

  • для индекса, элемента в Перечислим (LST):
  • для I, пункт в Перечислим (ы):

В первом случае это перебирает список и во втором он итерации через строку. Здесь может быть какая-то потеря производительности, но это не главная проблема.

  • если деталь в vowels_str:
  • если деталь в v_list:

Это, время работы идет. В первом случае (рабочий код) он ищет символ в строке, состоящей из гласных, которая имеет постоянную длину. Во втором случае он ищет символ в списке всех гласных, содержащихся в строке, который может быть огромным в зависимости от строки, указанной в тесте.

+0

Вы правы. Я просто нашел его ха-ха. –

1

В первом из них вы повторяете строку (s) напрямую, несколько раз. Во втором случае, после преобразования в список, вы повторяете этот список (lst).

Точная причина, по которой это вызывает разницу, - это (возможно, важная для правильности) деталь реализации в интерпретаторе python.

См родственный вопрос для дальнейшего обсуждения: Why is it slower to iterate over a small string than a small list?

Смежные вопросы