算法描述了最终能解决一个问题的计算过程。可读性和易维护性是重要的质量指标。
在计算机上运行算法会消耗两种资源:处理时间和空间或内存。当解决相同的问题或处理相同的数据集的时候,消耗这两种资源较少的算法会比消耗资源更多的算法具有更高的质量,因此,它也是更加合适的算法。
3.1.1度量算法的运行时间
# -*- coding:utf-8 -*-
import time
problemSize = 10000000
print('%12s%16s' % ('ProblemSize', 'second'))
for count in range(5):
# 定义起始时间
start = time.time()
work = 1
# 循环遍历问题大小
for x in range(problemSize):
# 使用work增减统计次数
work += 1
work -= 1
# 再次调用时间减去开始时间得到运行时间
elapsed = time.time() - start
print('%12s%16.3f' % (problemSize, elapsed))
# 问题大小翻倍
problemSize *= 2
ProblemSize second
10000000 1.553
20000000 2.749
40000000 5.514
80000000 11.129
160000000 29.064
不同硬件平台的处理速度不同,因此,一个算法的运行时间,在不同机器上是不同的。
对于很大的数据集合来说,确定某些算法的运行时间是不切实际的。
3.1.2统计指令
#-*- coding:utf-8 -*-
problemSize = 1000
print('%12s%15s' % ('ProblemSize', 'Iterations'))
for count in range(5):
#定义次数
number = 0
work = 1
#循环嵌套遍历问题大小的平方
for j in range(problemSize):
for k in range(problemSize):
#统计次数
number += 1
work += 1
work -= 1
print('%12d%15d' % (problemSize, number))
#循环一次后问题大小翻倍
problemSize *= 2
ProblemSize Iterations
1000 1000000
2000 4000000
4000 16000000
8000 64000000
16000 256000000
估算算法性能的另一种技术,是统计对不同的问题规模所要执行的指令的数目。
#-*- coding:utf-8 -*-
from counter import Counter
#递归实现Fibonacci函数
def fib(n, counter):
#递增一次,并记数
counter.incremnet()
if n < 3:
return 1
else:
return fib(n-1, c