引入问题
枚举法:
基本思想:挨个举例,挨个往里套。是最简单,效率最低的思想。此处运用time模块来计算程序运行的时间
import time
start_time=time.time()
for a in range(1001):
for b in range(1001):
for c in range(1001):
if a+b+c==1000 and a**2+b**2==c**2:
print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print("枚举法times:%d"%(end_time-start_time))
print("finished")
运行结果为:
枚举法用了102秒,可见其改进空间不小。
算法的五大特性
1.输入:算法具有0个活多个输入
2.输出:算法至少有一个或多个输出
3.有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
4.确定性:算法中每一步都有确定的含义,无二义性
5.可行性:算法的每一步都是可行的,也就是说每一步都能执行有限的次数完成
上例算法改进:因为a b c之间存在等式关系 因此可取消一个循环和一个条件判断。
import time
start_time=time.time()
for a in range(1001):
for b in range(1001):
c=1000-a-b
if a**2+b**2==c**2:
print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print("改进后算法times:%d"%(end_time-start_time))
print("finished")
稍微对算法进行改进,其运行时间减少至1秒,比之前快了99%。
那么怎么去衡量算法的效率高低呢?
算法的效率衡量:
1.看程序运行时间,但不够客观,因为机器性能不同,运行时间也不同
2.时间复杂度与大O计法:不同的机器虽然性能不同,但代码执行的次数相同
该问题枚举法运行次数:T=1000x1000x1000x2
改进后运行次数:T=1000x1000
在判断时间复杂度时 只在数量级的层面考虑而不去计较具体运行多少次,比如枚举法中条件判断的两次可忽略不计。
python内置类型性能分析
timeit模块——用来测试一小段python程序执行速度 Timer(stmt,setup,timer)
测试列表
from timeit import Timer
def t1():
li = []
for i in range(10000):
li.append(i)
def t2():
li = []
for i in range(10000):
li += [i]
def t3():
li = [i for i in range(10000)]
def t4():
li = []
for i in range(10000):
li.extend([i])
def t5():
li=[]
for i in range(10000):
li.insert(0,i)
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("列表生成器", timer3.timeit(1000))
timer4 = Timer("t4()", "from __main__ import t4")
print("extend", timer4.timeit(1000))
timer5 = Timer("t5()", "from __main__ import t5")
print("insert", timer5.timeit(1000))