Python代码运行时间差异

2024-04-20 10:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在练习Leetcode,我想问3个关于代码运行时间的问题。你知道吗

  1. 我注意到在Leetcode上,即使相同的代码也会有 如果多次提交,则运行时间不同。以及 差别很大,这正常吗?我把区别看得很清楚 第一次是26%,第二次是51%。真的是这样 当我想弄清楚我在哪里,怎么做的时候 很好,代码是。

  2. 实际代码:Leetcode p21,remove element

这是从int列表中删除一个值的所有元素,而不创建新列表,并返回新列表的长度。你知道吗

def removeElement(IntList, val):
    n = 0
    while n < len(IntList): 
        if IntList[n] == val:
           IntList.pop(n)   
        else:
            n += 1  
    return len(IntList)

def removeElement2(IntList, val): 
    while val in IntList:
        IntList.remove(val)
    return len(IntList)

你可以看到,我写了两个可以工作的函数,第二个比第一个短得多,但是第一个似乎更快。我想知道为什么。你知道吗

  1. 在不必提交Leetcode的情况下,找出一组代码是否比另一组代码快的最佳方法是什么?你知道吗

谢谢你


Tags: 代码列表lenreturndef时间valelement
1条回答
网友
1楼 · 发布于 2024-04-20 10:48:38

对于感兴趣的人,我尝试使用timeit来评估这两个函数。结果很有趣,我发现随着列表长度的增加,这两个函数的效率会发生变化:

当列表较短时,第一个比第二个慢得多:

print(timeit.Timer('removeElement(nums, val)',
                   setup='from __main__ import removeElement; '
                         'nums = [1, 2, 3, 4, 2, 3, 4, 4, 5, 6, 1, 2, 3, 4];'
                         'val = 4')
      .repeat(3, 1000000))

# >>> [1.8547368030012876, 1.7035995290007122, 1.718884424000862]

print(timeit.Timer('removeElement2(nums, val)',
                   setup='from __main__ import removeElement2; '
                         'nums = [1, 2, 3, 4, 2, 3, 4, 4, 5, 6, 1, 2, 3, 4];'
                         'val = 4')
      .repeat(3, 1000000))
# >>> [0.4291627630009316, 0.4323928640005761, 0.43043123800089234]

但是,如果我创建一个非常长的列表:

print(timeit.Timer('removeElement(nums, val)',
                   setup='from __main__ import removeElement; '
                         'nums = list(range(10)) * 10000;'
                         'val = 4')
      .repeat(3, 100))

# >>> [1.5640779950008437, 1.5756833779996668, 1.6097137039996596]

print(timeit.Timer('removeElement2(nums, val)',
                   setup='from __main__ import removeElement2; '
                         'nums = list(range(10)) * 10000;'
                         'val = 4')
      .repeat(3, 100))
# >>> [11.877236265998363, 11.790503606998755, 12.056773186999635]

第二个功能现在慢多了。你知道吗

相关问题 更多 >