文章目录
- 一、时间复杂度
- 1.时间复杂度的基本计算规则
- 2.timeit模块
- 3.内置操作的时间复杂度
- 二、数据结构
a,b,c勾股定理算法(时间复杂度O(n^2)):
import time
start_time = time.time()
for a in range(0, 1001):
for b in range(0, 1001): #循环内层
c = 1000-a-b #这里的operator是 =
if a**2+b**2 == c**2: #注意operator是 ==,并且左右有空格
print("a,b,c:%d,%d,%d" % (a, b, c)) # :%d” % () 取整数,并且括号里是表达式
end_time = time.time()
print("time:%d" %(end_time-start_time))一、时间复杂度
时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n))→渐进函数,那么则称O(g(n))是算法A的时间复杂度
最坏时间复杂度:算法完成工作最多需要多少基本操作
最优时间复杂度:算法完成工作最少需要多少基本操作
平均时间复杂度:算法完成工作平均需要多少基本操作
1.时间复杂度的基本计算规则
- 基本操作,即只有常数项,认为其时间复杂度只有O(1)
- 顺序结构,时间复杂度按加法进行计算
- 循环结构,时间复杂度按乘法进行计算
- 分支结构,时间复杂度取最大值
- 判断一个算法效率时,往往只需要关注操作数量的最高次项,常数项和次要项都可以忽略


2.timeit模块
timeit模块
用来测试python一小段代码的执行速度
class timeit.Timer(stmt=“pass”,setup=“pass”,time<= < timer fuction>)
Timer是执行小段代码执行速度的类。
stmt是要测试的代码语句(statement)
setup参数是运行代码所需要的设置;
timer参数是一个定时器函数,与平台有关
Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000.
from timeit import Timer # 注意导入
def func01():
li = []
for i in range(10000):
li.append(i)
def func02():
li = []
for i in range(10000):
li += [i] #相比于li=li+[i]有一定程度的优化
def func03():
li = [i for i in range(10000)]
def func04():
li = list(range(10000))
def func05():
li = []
for i in range(10000):
li.extend([i]) # extend()加上的的是列表,在空间上有消耗
def func06():
li = []
for i in range(10000):
li.insert(0, i) # insert从头开始添加非常慢
# Timer()中含有的是字符串,""中是函数的完整性是,从模块中导入的是不含()的函数形式
timer1 = Timer("func01()","from __main__ import func01")
print("append:",timer1.timeit(1000))
timer2 = Timer("func02()","from __main__ import func02")
print("+:",timer2.timeit(1000))
timer3 = Timer("func03()","from __main__ import func03")
print("[]:",timer3.timeit(1000))
timer4 = Timer("func04()","from __main__ import func04")
print("list:",timer4.timeit(1000))
timer5 = Timer("func05()","from __main__ import func05")
print("extend:",timer5.timeit(1000))
timer6 = Timer("func06()","from __main__ import func06")
print("insert:",timer6.timeit(1000))pop从头部取元素也比在尾部取元素要慢得多
3.内置操作的时间复杂度

index[]:指定一个位置并且把元素取出,这个过程通过一个步骤就能取出(区分与index(value)访问元素)
index assignment:进行赋值
pop():最坏情况是从头部去取,n代表列表的长度
del:代表一个个地清空
iteration:迭代
contain:需要遍历整个列表
slice():从x位置开始取,取到y,k代表x到y
set slice:重新排序并且还要再补充k数量的内容
concatenate:代表把两个列表加到一起,k是第二个列表中的元素
multiply:长度为n的列表被出现k次

delete item:删除一个键不需要遍历
二、数据结构
数据结构:一组数据的保存形式,例如:元组,列表,字典,集合
python的扩展数据结构:栈,队列等。
算法与数据结构的区别
程序 = 数据结构+算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体
抽象数据类型(abstract data type)
把其本身和支持的数据类型放在一起
最常见的数据运算:
- 插入
- 删除
- 修改
- 排序
- 查找
class Stus(object):
def adds(self):
def sort:
















