python代码运行时差

时间:2018-01-19 21:52:49

标签: python algorithm

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

  1. 我注意到在Leetcode上,即使是相同的代码也会有相当的代码 如果多次提交,则运行时间不同。而且 差异很大,这是正常的吗?我已经看到了差异 第一次击败26%,但第二次击败51%。那是真的 困惑我,而我正试图弄清楚我在哪里以及如何 代码很好。

  2. 实际代码:Leetcode p21,删除元素

  3. 这是从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的最佳方法是什么?
    2. 谢谢,

1 个答案:

答案 0 :(得分:0)

对于那些感兴趣的人,我尝试使用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]

现在第二个功能要慢得多。