timeit
timeit模块可以用来测试一小段Python代码的执行速度。
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
python不同list类型操作效率
from timeit import Timer
li1 = [1, 2]
li2 = [23, 5]
# 创建列表的四种方式
l = li1 + li2 # 列表相加
l = [] # 空列表追加
l = [i for i in range(10000)] # 向列表中放入range
l = list(range(10000)) # 转换成列表
def testList1():
list1 = []
for i in range(10000):
list1 += [i]
def testList2():
list2 = []
for i in range(10000):
list2.append(i)
def testList3():
list3 = [i for i in range(10000)]
def testList4():
list4 = list(range(10000))
def testList5():
list5 = []
for i in range(10000):
list5.insert(0,i)
print("测试运行时间比较:")
timer1 = Timer("testList1()", "from __main__ import testList1")
print("+:", timer1.timeit(1000)) # 0.844717138
timer2 = Timer("testList2()", "from __main__ import testList2")
print("append:", timer2.timeit(1000)) # 0.7383539509999999
timer3 = Timer("testList3()", "from __main__ import testList3")
print("for range:", timer3.timeit(1000)) # 0.34893865300000004
timer4 = Timer("testList4()", "from __main__ import testList4")
print("list range:", timer4.timeit(1000)) # 0.17512708700000013
timer5 = Timer("testList5()", "from __main__ import testList5")
print("insert:", timer5.timeit(1000)) # 31.671403257
可以看出从上往下依次效率越来越高。insert则速度最慢,他是往列表头添加,这个和他的数据结构有关,因为List是python封装好的数据结构,所以往头部添加和往尾部添加有显著的效率差异。我们后面会详细分析。
x = range(2000000)
pop_zero = Timer("x.pop(0)","from __main__ import x")
print("pop_zero ",pop_zero.timeit(number=1000), "seconds")
x = range(2000000)
pop_end = Timer("x.pop()","from __main__ import x")
print("pop_end ",pop_end.timeit(number=1000), "seconds")
# ('pop_zero ', 1.9101738929748535, 'seconds')
# ('pop_end ', 0.00023603439331054688, 'seconds')
这里可以发现,弹出尾部比弹出首部效率要高很多。这也是因为数据结构的问题。