我们已知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)