timeit模块
官方的解释是
Tool for measuring execution time of small code snippets
即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类型的秒数。
list的操作测试
test1 = """
l = []
for i in range(1000):
l = l+[i]"""
test2 = """
l = []
for i in range(1000):
l.append(i)"""
test3 = """
l = [i for i in range(1000)]"""
test4 = """
l = list(range(10000))"""
t1 = timeit.Timer(stmt=test1)
print("concat ", t1.timeit(1000), "seconds")
t2 = timeit.Timer(stmt=test2)
print("append ", t2.timeit(1000), "seconds")
t3 = timeit.Timer(stmt=test3)
print("comprehension ", t3.timeit(1000), "seconds")
t4 = timeit.Timer(stmt=test4)
print("list range ", t4.timeit(1000), "seconds")
#运行结果
#concat 1.7421829360894936 seconds
#append 0.081117687196822 seconds
#comprehension 0.035780336566269666 seconds
#list range 0.15885251670817335 seconds
根据运行结果可知,列表解析式是比你append也快很多的,concat是非常慢的,所以平常非常不建议用相加的形式,首选用列表解析式
pop操作测试
x = [i for i in range(10000)]
#删除第一个元素
pop_zero = timeit.Timer(stmt = "x.pop(0)",setup="from __main__ import x")
print("pop_zero ", pop_zero.timeit(number=1000), "seconds")
#尾部删除
pop_end = timeit.Timer(stmt="x.pop()", setup="from __main__ import x")
print("pop_end ",pop_end.timeit(number=1000),"seconds")
输出结果
pop_zero 0.003709113376900391 seconds
pop_end 7.955891000443636e-05 seconds
根据测试,可知pop最后一个元素的速度远比pop头部的要快很多
根据python官网给出的结果可知:
list内置操作的时间复杂度
list.pngdict内置操作的时间复杂度
dict.pngk是代表x-y的区间距离,切片需O(k)的时间复杂度。
以上的内置时间复杂度是python官网的
网友评论