为什么这两个几乎相同的代码有不同的效率(Python)?

时间:2016-05-16 06:50:43

标签: python python-2.7

我在leetcode上用Python练习编程。

所以这就是问题所在: https://leetcode.com/problems/reverse-vowels-of-a-string/

这是我的答案:

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

结果:SELECT * FROM RestaurantOffer WHERE Getdate() Between cast(FromDate as datetime) + cast(FromTime as datetime) and cast(ToDate as datetime)+cast(ToTime as datetime)

这太奇怪了。我认为这两个代码看起来完全一样。

它们的不同之处仅仅是参数。

我很好奇为什么这些代码会导致不同的结果。

2 个答案:

答案 0 :(得分:3)

两个代码之间有两条不同的行。 第一个是:

  • 表示index,枚举项目(lst):
  • for i,枚举项:

在第一种情况下,它遍历列表,在第二种情况下,它遍历字符串。这里可能会有一些性能损失,但这不是主要问题。

  • 如果项目在vowels_str:
  • 如果v_list中的项目:

这是运行时间的地方。在第一种情况下(工作代码),它查找由元音组成的字符串中的字符,该字符具有恒定的长度。 在第二种情况下,它会查找字符串中包含的所有元音列表中的字符,这可能很大,具体取决于测试中给出的字符串。

答案 1 :(得分:1)

在第一个中,您将多次直接迭代字符串(s)。在第二个,转换为列表后,您将迭代该列表(lst)。

这导致差异的确切原因是python解释器中的实现细节(通常很大且可能对正确性很重要)。

有关更多讨论,请参阅相关问题:Why is it slower to iterate over a small string than a small list?