python两种内置数据类型上各个操作的大O数量级
列表list和字典dict
对比list和dict的操作
80/20准则:80%的功能其使用率只有20%
所以越常用的功能,优化的越好,性能就越好
list列表数据类型常用的操作性能
最常用的是:按索引取值和赋值(v=a[i],a[i]=v)
由于列表的随机访问的特性,这两个操作执行的时间与大小无关,均为O(1)
列表增长:可以选择append()和+
lst.append(v),执行时间是O(1)
lst=lst+[v],执行时间是O(n+k),其中k是被加的列表长度
我们来举个例子如何计算性能
下面是4种生成n个列表的方法循环连接列表(+)方式生成
append方法添加元素生成
列表推导式
range函数调用转成列表
def text1():
# 1. 循环连接列表(+)方式生成
l = []
for i in range(1000):
l=l+[i]
def text2():
# 2. append方法添加元素生成
l=[]
for i in range(1000):
l.append(i)
def text3():
# 3. 列表推导式
l=[i for i in range(1000)]
def text4():
# 4. range函数调用转成列表
l = list(range(1000))
我们分别运行这些函数,并计时
这里使用timeit模块来对其计时
代码如下:
from timeit import Timer
def text1():
# 1. 循环连接列表(+)方式生成
l = []
for i in range(1000):
l=l+[i]
def text2():
# 2. append方法添加元素生成
l=[]
for i in range(1000):
l.append(i)
def text3():
# 3. 列表推导式
l=[i for i in range(1000)]
def text4():
# 4. range函数调用转成列表
l = list(range(1000))
if __name__ == "__main__":
t1 = Timer('text1()','from __main__ import text1')
print('text1. %f s'% t1.timeit(number=1000))
t2 = Timer('text2()','from __main__ import text2')
print('text2. %f s'% t2.timeit(number=1000))
t3 = Timer('text3()','from __main__ import text3')
print('text3. %f s'% t3.timeit(number=1000))
t4 = Timer('text4()','from __main__ import text4')
print('text4. %f s'% t4.timeit(number=1000))
这里是把每个函数都运行了1000次并计时
运行结果:
text1. 2.097764 s
text2. 0.114630 s
text3. 0.061288 s
text4. 0.022224 s
这里可以清楚的看到,这四种方法运行时间的差距还是比较大的 最慢的是text1函数,用的是循环连接列表(+)方式生成 最快的是text4函数,用的是range函数调用转成列表生成
List基本操作的大O数量级
Dict基本操作的大O数量级
python官方的算法复杂度网站TimeComplexity - Python Wikiwiki.python.org