测试列表的操作append和insert的效率:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: json_steve
def test_append():
li = []
for i in range(1000):
li.append(i)
def test_insert():
li = []
for i in range(1000):
li.insert(0, i)
from timeit import Timer
timer = Timer('test_append()', 'from __main__ import test_append')
print(timer.timeit(10000))
print('----------------------------------------------------------------')
timer1 = Timer('test_insert()', 'from __main__ import test_insert')
print(timer1.timeit(10000))
结果:
1.1129768738528019
----------------------------------------------------------------
4.213525822249263
为什么同时插入操作,时间相差很多,查找list操作的时间复杂度:append的时间复杂度用大O表示是O(1),insert()的时间复杂度是O(n),所以不同但是为什么呢?
在python 中的list和tuple都是顺序表,在元素存储区的方法是元素外置的,表头是分离式的。
插入时,假设没有超过元素的上线,也就是先不考虑扩容的情况: 如果在尾部插入,那么根据表头记录的元素个数,找到尾部(不用遍历),然后直接插入就可以了,所以时间频度就是1,渐进函数也是1,大O表示也是O(1)。但是如果要插入列表的起始位置,那么所有的原始元素都需要向尾部退后一位,这就需要遍历所有元素,假设元素有n个,所以时间频度就是n,渐进函数也是n,大O表示O(n)。