分析pop()和pop(i)的性能差异-python

六月ゝ 毕业季﹏ 提交于 2020-03-02 04:18:46

《Python数据结构与算法分析》(第二版)

pop()时间复杂度O(1)
pop(i)时间复杂度O(n)

1. 针对一个已知长度的列表,分别从列表头和列表尾弹出一个元素

import timeit

x = list(range(2000000))
y = list(range(2000000))

# 在测试中使用列表对象x,可以只对pop语句计时,从而准确得到这个操作的耗时
# 因为重复计时了1000次,所以列表每次循环都少一个元素,但列表的初始长度是200万,因此对整体长度来说,只减少了0.05%
popzero = timeit.Timer("x.pop(0)", "from __main__ import x")
print("pop(0) ", popzero.timeit(number=1000))

popend = timeit.Timer("y.pop()", "from __main__ import y")
print("pop() ", popend.timeit(number=1000))

运行结果:
在这里插入图片描述
测试结果虽然说明pop(0)确实比pop()慢,但并没有证明pop(0)的时间复杂度是O(n),也没有证明pop()的时间复杂的是O(1),故需要进一步测试这两个操作在不同列表长度下的性能。

2. 比较pop(0)和pop()在不同列表长度下的性能

import timeit

popzero = timeit.Timer("x.pop(0)", "from __main__ import x")
popend = timeit.Timer("x.pop()", "from __main__ import x")
print("pop(0) pop()")
for i in range(1000000, 100000001, 1000000):#循环100次
    x = list(range(i))
    pt = popend.timeit(number=1000)
    x = list(range(i))
    pz = popzero.timeit(number=1000)
    print("%15.5f, %15.5f" % (pz, pt))

运行结果:
在这里插入图片描述
从测试结果可以看出,列表越长,pop(0)的耗时也随之变长,而pop()的耗时很稳定。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!