我们已知python是具有非常多的包一种开源语言,封装了各种算法。
python典型的数据结构为列表/元组/字符串/字典,与C/C++中的数组(array)/ 栈(stack) /(优先)队列”(queue) / 二叉树(binary tree)有明显区别。
在python官网中指出,列表可以作为栈和队列使用,但是并未给出特别详细具体的教程。
在python官网上有关于list和dict数据结构的描述参考,如链接所示,但是没有关于时间复杂度和空间复杂度的分析。本文是对官网内容一个实例化和补充
官网链接:https://docs.python.org/zh-cn/3/tutorial/datastructures.html
本文内容部分参考:哔哩哔哩网站上“自学IT工程师”的“python学习教程之数据结构和算法基础”
具体参考链接:https://www.bilibili.com/video/av46256220/?p=6
https://www.bilibili.com/video/av46256220/?p=7
根据这一系列的教程,将在系列文章中给出与C语言中的数据结构逐一对应的python解法
测算一小段代码的执行速度采用timeit这个包,timeit用法参考:https://docs.python.org/3/library/timeit.html
常用的参数定义为:
class timeit.Timer(stmt ='pass',setup ='pass',timer =
,globals = None )
用法的简单示例为:
timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
测算生成list的算法效率
from timeit import Timer
def t1():
li = []
for i in range(10000):
li.append(i)
def t2():
li = []
for i in range(10000):
li = li+ [i]
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(10000))
def t5():
for i in range(10000):
li.extend([i])
def t6():
li = []
for i in range(10000):
li.insert(0,i)
# 采用timeit测算一小段代码的运行速度
# 追加操作
timer1 = Timer('t1()','from __main__ import t1')
print('.append: ',timer1.timeit(1000))
# 加操作操作
timer2 = Timer('t2()','from __main__ import t2')
print('+: ',timer2.timeit(1000))
#列表生成器
timer3 = Timer('t3()','from __main__ import t3')
print('[i for i in range]: ',timer3.timeit(1000))
# 列表生成器类似的转换
timer4 = Timer('t4()','from __main__ import t4')
print('list(range()): ',timer4.timeit(1000))
# 扩展操作
timer5 = Timer('t5()','from __main__ import t5')
print('extend: ',timer5.timeit(1000))
#插入操作
timer6 = Timer('t6()','from __main__ import t6')
print('insert :',timer6.timeit(1000))
输出结果为
.append: 0.7118582189999999
+: 114.38965233500001
[i for i in range]: 0.3101561069999974
list(range()): 0.16905038100000525
extend: 1.4377866079999961
insert : 30.547064246999994
从以上输出结果可以看出,字符串‘+’操作的速度最慢,在循环次数多的时间特别明显,所以尽量避免使用;追加操作和列表生成器的速度相当,建议采纳,扩展的速度稍慢,但也可以;插入操作特别是从头部插入操作,因为后面所有的元素都要向后移动一位,所以速度最慢。
绝大部分情况下,我们更关注算法的时间复杂度。
除了以上引用到的列表(list)的方法以外,list和dict还有很多内置操作,他们的时间复杂度如下所示。
List 内置操作的时间复杂度
Operation Big-O Efficiency
index[] O(1)
index assignment O(1)
append O(1)
pop() O(1)
pop(i) O(n)
insert() O(n)
del operator O(n)
iteration O(n)
contains(in) O(n)
get slice O(n)
set slice O(n+k)
reversed O(n)
concatenate O(n)
sort O(nlogn)
multiply O(nk)
dict 内置操作的时间复杂度
operation Big-O Effeciency
copy O(n)
get item O(1)
set item O(1)
contains(in) O(1)
iteration O(1)

