我在Leetcode上练习,我想问3个关于代码运行时间的问题。
我注意到在Leetcode上,即使是相同的代码也会有相当的代码 如果多次提交,则运行时间不同。而且 差异很大,这是正常的吗?我已经看到了差异 第一次击败26%,但第二次击败51%。那是真的 困惑我,而我正试图弄清楚我在哪里以及如何 代码很好。
实际代码:Leetcode p21,删除元素
这是从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)
你可以看到我写了两个可以工作的函数,第二个函数比第一个函数短得多,但不知怎的,第一个看起来更快。我想知道为什么。
谢谢,
答案 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]
现在第二个功能要慢得多。