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

2024-09-27 23:21:41 发布

您现在位置: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

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

它们的区别只是参数。你知道吗

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


Tags: inforindexifdefresultitemlist
2条回答

在第一个例子中,您直接对字符串(s)进行多次迭代。在第二种情况下,在转换为列表之后,您将迭代该列表(lst)。你知道吗

造成这种差异的确切原因是python解释器中的一个实现细节(当然,对于正确性来说是非常重要的)。你知道吗

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

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

  • 对于索引,枚举(lst)中的项:
  • 对于i,枚举中的项:

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

  • 如果项目在元音中\u str:
  • 如果v\u列表中的项目:

这就是跑步时间的方向。在第一种情况下(工作代码),它在元音组成的字符串中查找长度恒定的字符。 在第二种情况下,它在字符串中包含的所有元音的列表中查找字符,根据测试中给定的字符串,这个字符可能很大。你知道吗

相关问题 更多 >

    热门问题